ਸਟ੍ਰੀਮਲਾਈਨਿੰਗ ਟੈਂਪਲੇਟ ਫੰਕਸ਼ਨ C ++ ਵਿਚ ਕਾਲ ਕਰਦਾ ਹੈ
ਟੈਂਪਲੇਟਸ ਆਧੁਨਿਕ ਸੀ ++ ਪ੍ਰੋਗਰਾਮਿੰਗ ਦਾ ਅਧਾਰ ਹਨ, ਸਮਰੱਥ ਬਣਾਉਣ ਦੇ ਯੋਗ ਹਨ, ਲਚਕਦਾਰ ਅਤੇ ਮੁੜ ਵਰਤੋਂ ਯੋਗ ਕੋਡ ਲਿਖਣ ਲਈ. ਹਾਲਾਂਕਿ, ਟੈਂਪਲੇਟ ਫੰਕਸ਼ਨ ਦੇ ਫੰਕਸ਼ਨ ਦੇ ਨਾਲ ਕੰਮ ਕਰਨਾ ਅਕਸਰ ਦੁਹਰਾਏ ਬਾਇਲਰਟ ਨੂੰ ਪੇਸ਼ ਕਰਦਾ ਹੈ, ਜੋ ਕੋਡਬੇਸ ਨੂੰ ਖੜਕ ਸਕਦਾ ਹੈ ਅਤੇ ਪੜ੍ਹਨਯੋਗਤਾ ਨੂੰ ਘਟਾ ਸਕਦਾ ਹੈ. ਇਹ ਪ੍ਰਸ਼ਨ ਉਠਾਉਂਦਾ ਹੈ: ਕੀ ਅਸੀਂ ਅਜਿਹੇ ਪੈਟਰਨ ਨੂੰ ਸਰਲ ਬਣਾ ਸਕਦੇ ਹਾਂ?
ਇਕ ਅਜਿਹੀ ਸਥਿਤੀ ਦੀ ਕਲਪਨਾ ਕਰੋ ਜਿੱਥੇ ਤੁਹਾਡੇ ਕੋਲ ਇਕ ਕਲਾਸ ਵਿਚ ਬਹੁਤ ਸਾਰੇ ਟੈਂਪਲੇਟਡ ਮੈਂਬਰ ਹੁੰਦੇ ਹਨ, ਜੋ ਕਿ `, ਅਤੇ` ਫਲੋਟ`. ਹਰ ਕਿਸਮ ਦੇ ਹਰੇਕ ਕਾਰਜ ਨੂੰ ਕਾਲ ਕਰਨ ਦੀ ਬਜਾਏ, ਤਰਕ ਨੂੰ ਸਾਫ ਅਤੇ ਸ਼ਾਨਦਾਰ ਡਿਸਪੈਚਰ ਫੰਕਸ਼ਨ ਵਿੱਚ ਤਰਕ ਕੇਂਦਰੀਕਰਨ ਲਈ ਵਧੀਆ ਨਹੀਂ ਹੋਏਗਾ? ਇਹ ਰਿਡੰਡੈਂਸੀ ਨੂੰ ਮਹੱਤਵਪੂਰਣ ਘਟਾ ਦੇਵੇਗਾ ਅਤੇ ਕੱਪੜੇ ਵਿੱਚ ਸੁਧਾਰ ਕਰੇਗਾ. 🚀
ਟੈਂਪਲੇਟਡ ਮੈਂਬਰ ਨੂੰ ਫੰਕਸ਼ਨ ਨੂੰ ਪਾਸ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਨਾ ਟੈਂਪਲੇਟ ਪੈਰਾਮੀਟਰਾਂ ਵਾਂਗ ਹੀ ਕੁਦਰਤੀ ਹੱਲ ਵਾਂਗ ਲੱਗਦਾ ਹੈ. ਹਾਲਾਂਕਿ, ਪ੍ਰਾਪਤ ਕਰਨਾ ਸੀ ++ ਦੇ ਟਾਈਪ ਸਿਸਟਮ ਅਤੇ ਟੈਂਪਲੇਟ ਸੰਟੈਕਸ ਦੀਆਂ ਪੇਚੀਦਗੀਆਂ ਦੇ ਕਾਰਨ ਸਿੱਧਾ ਨਹੀਂ ਹੈ. ਡਿਵੈਲਪਰ ਅਕਸਰ ਕੰਪਾਈਲਰ ਗਲਤੀਆਂ ਵਿੱਚ ਚਲਾਉਂਦੇ ਹਨ ਜਦੋਂ ਅਜਿਹੀ ਪੈਟਰਨ ਨੂੰ ਸਿੱਧਾ ਲਾਗੂ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰ ਰਹੇ ਹੋ.
ਇਸ ਲੇਖ ਵਿਚ, ਅਸੀਂ ਪੜਚੋਲ ਕਰਾਂਗੇ ਕਿ ਕਿਸੇ ਨੂੰ ਭੇਜਣ ਵਾਲੇ ਫੰਕਸ਼ਨ ਨੂੰ ਡਿਜ਼ਾਈਨ ਕਰਨਾ ਸੰਭਵ ਹੈ ਕਿ ਕਿਸਮਾਂ ਦੇ ਇਕ ਤਰਤੀਬ ਅਤੇ ਵੱਖ-ਵੱਖ ਟੈਂਪਲੇਸ ਫੰਕਸ਼ਨਾਂ ਨੂੰ ਦੁਹਰਾ ਦੇ ਸਕਦਾ ਹੈ. ਅਸੀਂ ਚੁਣੌਤੀਆਂ ਅਤੇ ਸੰਭਾਵੀ ਹੱਲਾਂ ਨੂੰ ਪ੍ਰਦਰਸ਼ਤ ਕਰਨ ਲਈ ਵਿਹਾਰਕ ਉਦਾਹਰਣਾਂ ਦੁਆਰਾ ਵੀ ਚਲਦੇ ਹਾਂ. ਆਓ ਅੰਦਰ ਗੋਤਾਖੋਰੀ ਕਰੀਏ! 🛠️
ਕਮਾਂਡ | ਵਰਤੋਂ ਦੀ ਉਦਾਹਰਣ |
---|---|
std::tuple | ਇੱਕ ਕੰਟੇਨਰ ਜੋ ਵੱਖ-ਵੱਖ ਕਿਸਮਾਂ ਦੇ ਤੱਤਾਂ ਦੀ ਇੱਕ ਨਿਸ਼ਚਤ ਗਿਣਤੀ ਰੱਖਦਾ ਹੈ. ਡਿਸਪੈਚਰ ਫੰਕਸ਼ਨ ਵਿੱਚ ਦੁਹਰਾਉਣ ਲਈ ਕਿਸਮਾਂ ਦੇ ਕ੍ਰਮ ਨੂੰ ਸਟੋਰ ਕਰਨ ਲਈ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ. |
std::tuple_element | ਟੂਪਲ ਵਿੱਚ ਇੱਕ ਵਿਸ਼ੇਸ਼ ਤੱਤ ਦੀ ਪਹੁੰਚ ਤੱਕ ਪਹੁੰਚ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ. ਦੁਹਰਾਓ ਦੇ ਦੌਰਾਨ ਇੱਕ ਖਾਸ ਸੂਚਕਾਂਕ ਤੇ ਟਾਈਪ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ. |
std::index_sequence | ਪੂਰਨ ਅੰਕ ਦਾ ਇੱਕ ਕੰਪਾਈਲ ਟਾਈਮ ਕ੍ਰਮ ਤਿਆਰ ਕਰਦਾ ਹੈ, ਉਹਨਾਂ ਨੂੰ ਦਸਤੀ ਨਿਰਧਾਰਤ ਕੀਤੇ ਬਿਨਾਂ ਟੌਪਲ ਦੀਆਂ ਕਿਸਮਾਂ ਵਿੱਚ ਦੁਹਰਾਉਂਦਾ ਸੀ. |
std::make_index_sequence | ਇੱਕ STD :: 0 ਤੋਂ ਐਨ -1 ਤੱਕ ਪੂਰਨ ਅੰਕ ਦੇ ਨਾਲ ਇੰਡੈਕਸ_ਸਵੇ. ਇੱਕ ਟੁਪਲ ਦੀਆਂ ਕਿਸਮਾਂ ਦੇ ਇੱਕ ਕੰਪਾਈਲ-ਟਾਈਮ-ਸੁਰੱਖਿਅਤ way ੰਗ ਨਾਲ ਦੁਹਰਾਓ. |
Fold Expressions | C ++ 17 ਵਿੱਚ ਪੇਸ਼ ਕੀਤਾ ਗਿਆ, ਫੋਲਡ ਸਮੀਕਰਨ ਪੈਰਾਮੀਟਰਾਂ ਦੇ ਇੱਕ ਪੈਕ ਤੇ ਲਾਗੂ ਕਰਨ ਲਈ ਫੋਲਡ ਸਮੀਕਰਨ ਲਾਗੂ ਕਰਨ ਲਈ ਫੋਲਡ ਪ੍ਰਗਟਾਵੇ ਦੀ ਵਰਤੋਂ ਕੀਤੀ ਜਾਂਦੀ ਹੈ. ਇੱਥੇ, ਇਹ ਹਰੇਕ ਕਿਸਮ ਦੇ ਟੁਪਲ ਵਿੱਚ ਟੈਂਪਲੇਟਡ ਫੰਕਸ਼ਨਾਂ ਨੂੰ ਕਾਲ ਕਰਨ ਲਈ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ. |
template template parameters | C ++ ਵਿਚ ਇਕ ਵਿਸ਼ੇਸ਼ ਵਿਸ਼ੇਸ਼ਤਾ ਜੋ ਇਕ ਨਮੂਨੇ (ਉਦਾ., Fn) ਨੂੰ ਇਕ ਪੈਰਾਮੀਟਰ ਦੇ ਤੌਰ ਤੇ ਇਕ ਪੈਰਾਮੀਟਰ ਨੂੰ ਇਕ ਦੂਜੇ ਨਮੂਨੇ ਵਿਚ ਪਾਸ ਕਰਨ ਦਿੰਦੀ ਹੈ. ਫੰਕਸ਼ਨ ਕਾਲਾਂ ਨੂੰ ਬਣਾਉਣ ਲਈ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ. |
Lambda with Variadic Templates | ਇੱਕ ਵੇਰੀਡੀ ਟੈਂਪਲੇਟ ਨਾਲ ਇਨਲਾਈਨ ਫੰਕਸ਼ਨ ਨਾਲ ਇੱਕ ਵੇਰੀਡਿਕ ਟੈਂਪਲੇਟ ਨਾਲ ਪਰਿਭਾਸ਼ਤ ਕਰਦਾ ਹੈ |
decltype | ਕੰਪਾਈਲ ਟਾਈਮ ਤੇ ਸਮੀਕਰਨ ਦੀ ਕਿਸਮ ਨੂੰ ਘਟਾਉਣ ਲਈ ਵਰਤਿਆ ਜਾਂਦਾ ਸੀ. ਫੰਕਸ਼ਨ ਆਰਗੂਮੈਂਟ ਜਾਂ ਰਿਟਰਨ ਕਿਸਮਾਂ ਦੀ ਕਿਸਮ ਨੂੰ ਘਟਾਉਣ ਵਿੱਚ ਸਹਾਇਤਾ ਕਰਦਾ ਹੈ. |
typeid | ਰਨਟਾਈਮ ਟਾਈਪ ਜਾਣਕਾਰੀ ਪ੍ਰਦਾਨ ਕਰਦਾ ਹੈ. ਇਸ ਸਕ੍ਰਿਪਟ ਵਿੱਚ, ਇਹ ਪ੍ਰਦਰਸ਼ਨ ਦੇ ਉਦੇਸ਼ਾਂ ਲਈ ਫਾਂਸੀ ਦੇ ਦੌਰਾਨ ਨਾਮ ਪ੍ਰਿੰਟ ਕਰਨ ਲਈ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ. |
C ++ ਵਿਚ C ੰਗ ਨਾਲ ਟੈਂਪਲੇਟ ਫੰਕਸ਼ਨ
ਸਕ੍ਰਿਪਟਾਂ ਉੱਪਰਲੀਆਂ ਸਕ੍ਰਿਪਟਾਂ C ++ ਵਿਚ ਇਕ ਵਿਸ਼ੇਸ਼ ਚੁਣੌਤੀ ਨਾਲ ਨਜਿੱਠਦੀਆਂ ਹਨ: ਇਕ ਸਾਫ ਅਤੇ ਮੁੜ ਵਰਤੋਂ ਯੋਗ ਤਰੀਕੇ ਨਾਲ ਇੰਪੁੱਟ ਕਿਸਮਾਂ ਦੇ ਉਸੇ ਤਰਤੀਬ ਲਈ ਵੱਖਰੇ ਟੈਂਪਲੇਟ ਦੇ ਸਦੱਸ ਕਾਰਜਾਂ ਨੂੰ ਬੁਲਾਉਂਦੇ ਹਨ. ਮੁ goal ਲਾ ਟੀਚਾ ਕੇਂਦਰੀ ਭੇਜਣ ਵਾਲੇ ਕਾਰਜਾਂ ਨੂੰ ਬਣਾ ਕੇ ਬਾਇਲਰਪਲੇਟ ਕੋਡ ਨੂੰ ਘਟਾਉਣਾ ਹੈ. ਦੀ ਵਰਤੋਂ , `for_each_type` ਫੰਕਸ਼ਨ ਆਟੋਮੈਟਿਕ ਫੰਕਸ਼ਨ ਆਟੋਮੈਟਿਕ ਫੰਕਸ਼ਨ ਆਟੋਮੈਟਿਕ ਫੰਕਸ਼ਨ ਨੂੰ ਸਵੈਚਾਲਿਤ ਕਿਸਮਾਂ ਜਿਵੇਂ ਪਹਿਲਾਂ ਪਰਿਭਾਸ਼ਿਤ ਕਿਸਮਾਂ ਲਈ ਫੰਕਸ਼ਨ ਕਰਦੇ ਹਨ, ਜਿਵੇਂ ਕਿ`, ਅਤੇ `ਫਲੋਟ`. ਇਹ ਉੱਨਤ ਸੰਦਾਂ ਨੂੰ ਲੇਅਰਿੰਗ ਕਰਦਾ ਹੈ ਜਿਵੇਂ ਕਿ `std :: ਤੁਪਲ` ਡੁਪਲਿਕ ਟੈਂਪਲੇਟਸ, ਅਤੇ ਫੋਲਡ ਅਤੇ ਕੁਸ਼ਲ ਦੋਨੋ ਹੱਲ ਬਣਾਉਂਦੇ ਹਨ. 🚀
ਪਹਿਲੀ ਪਹੁੰਚ `std :: ਤੁਪਕੇ ਨੂੰ ਕਿਸਮ ਦਾ ਕ੍ਰਮ ਰੱਖਣ ਲਈ. ਸੰਜੋਗ ਨਾਲ `std :: ਤੁਪਲ_ਲਮੈਂਟ` ਅਤੇ` std :: ਕੰਪਾਈਲ ਸਮੇਂ ਇਸ ਕਿਸਮ ਦੀਆਂ ਕਿਸਮਾਂ ਦੇ ਨਾਲ ਅਸੀਂ ਇਸ ਤਰਾਂ ਦੀਆਂ ਕਿਸਮਾਂ ਨੂੰ ਦੁਹਰਾ ਸਕਦੇ ਹਾਂ. ਇਹ `for_aech_tep ਲਾਗੂ ਨੂੰ ਗਤੀਸ਼ੀਲ ਮੈਂਬਰ ਫੰਕਸ਼ਨ ਦੀ ਮੰਗ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ. ਉਦਾਹਰਣ ਦੇ ਲਈ, ਸਕ੍ਰਿਪਟ ਇਹ ਸੁਨਿਸ਼ਚਿਤ ਕਰਦੀ ਹੈ ਕਿ `ਏ
ਦੂਜੀ ਪਹੁੰਚ ਲਾਂਬਾਡਾ ਦੀ ਵਰਤੋਂ ਕਰਦੀ ਹੈ ਤਾਂ ਵੱਖੋ ਵੱਖਰੇ ਕਾਰਜਕੁਸ਼ਲਤਾ ਨੂੰ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ ਵਰਿਆਬੱਧ ਟੈਂਪਲੇਟਸ ਦੇ ਨਾਲ. ਇੱਥੇ, ਇੱਕ ਲਾਂਬਡਾ `ਲਈ ਪਾਸ ਕੀਤਾ ਗਿਆ ਹੈ` _ _ ਲਾਂਡਾ ਪਹੁੰਚ ਨੂੰ ਅਕਸਰ ਆਧੁਨਿਕ ਸੀ +++ ਪ੍ਰੋਗਰਾਮਿੰਗ ਵਿਚ ਤਰਜੀਹ ਦਿੱਤੀ ਜਾਂਦੀ ਹੈ ਕਿਉਂਕਿ ਇਹ ਲਾਗੂ ਕਰਨ ਦਾ ਸਰਲ ਕਰਦਾ ਹੈ ਅਤੇ ਟਿ uples ਲਜ਼ ਵਰਗੇ ਗੁੰਝਲਦਾਰ ਸੰਦਾਂ 'ਤੇ ਨਿਰਭਰਤਾ ਨੂੰ ਘਟਾਉਂਦਾ ਹੈ. ਉਦਾਹਰਣ ਦੇ ਲਈ, ਇਹ ਪਹੁੰਚ ਫੰਕਸ਼ਨ ਕਾਲਾਂ ਨੂੰ ਵਧਾਉਣਾ ਜਾਂ ਸੰਸ਼ੋਧਿਤ ਕਰਨਾ ਸੌਖਾ ਬਣਾ ਦਿੰਦਾ ਹੈ, ਜਿਵੇਂ ਕਿ `ਏ
ਦੋਵੇਂ ਤਰੀਕੇ ਸੀ +++ 17 ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਦਾ ਲਾਭ ਲੈ ਕੇ ਜਾਂਦੇ ਹਨ, ਜਿਵੇਂ ਕਿ ਫੋਲਡ ਸਮੀਕਰਨ ਅਤੇ `std :: فجار _indexces`ne`. ਇਹ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਇਹ ਸੁਨਿਸ਼ਚਿਤ ਕਰਨ ਦੁਆਰਾ ਯਕੀਨੀ ਬਣਾਉਂਦੀਆਂ ਹਨ ਕਿ ਸਾਰੇ ਕਾਰਜਾਂ ਨੂੰ ਕੰਪਾਈਲ ਸਮੇਂ ਤੇ ਵਾਪਰਦਾ ਹੈ, ਜਿਸ ਨਾਲ ਰਨਟਾਈਮ ਓਵਰਹੈੱਡ ਨੂੰ ਖਤਮ ਕਰਦਾ ਹੈ. ਇਸ ਤੋਂ ਇਲਾਵਾ, `ਟਾਈਪਿਡ ਇਨਸ ਸਪਸ਼ਟਤਾ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਰਨਟਾਈਮ ਟਾਈਪ ਜਾਣਕਾਰੀ ਨੂੰ ਸ਼ਾਮਲ ਕਰਨਾ, ਖ਼ਾਸਕਰ ਡੀਬੱਗਿੰਗ ਜਾਂ ਵਿਦਿਅਕ ਉਦੇਸ਼ਾਂ ਲਈ. ਇਹ ਮਦਦਗਾਰ ਹੋ ਸਕਦਾ ਹੈ ਜਦੋਂ ਵਿਧੀ ਕਰਨ ਵਾਲੇ ਕਿਸ ਕਿਸਮਾਂ ਤੇ ਕਾਰਵਾਈ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ. ਕੁਲ ਮਿਲਾ ਕੇ ਹੱਲ ਕੀਤੇ ਗਏ ਹੱਲ ਦੀ ਸ਼ਕਤੀ ਨੂੰ ਕਿਵੇਂ ਵਰਤਣਾ ਹੈ ਕਲੀਨਰ ਅਤੇ ਵਧੇਰੇ ਪ੍ਰਬੰਧਨ ਯੋਗ ਕੋਡ ਲਿਖਣ ਲਈ. ਦੁਹਰਾਉਣ ਵਾਲੇ ਤਰਕ ਨੂੰ ਸੰਖੇਪ ਵਿੱਚ, ਡਿਵੈਲਪਰ ਬਣਾਉਣ ਵਾਲੇ ਅਤੇ ਸਕੇਲ ਕਰਨ ਯੋਗ ਐਪਲੀਕੇਸ਼ਨਾਂ 'ਤੇ ਧਿਆਨ ਕੇਂਦ੍ਰਤ ਕਰ ਸਕਦੇ ਹਨ. 🛠️
C ++ ਵਿਚ ਟੈਂਪਲੇਟ ਫੰਕਸ਼ਨ ਨੂੰ ਲਾਗੂ ਕਰਨਾ
ਇਹ ਹੱਲ ਸੀ ++ ਪ੍ਰੋਗ੍ਰਾਮਿੰਗ ਤੇ ਕੇਂਦ੍ਰਤ ਕਰਦਾ ਹੈ ਅਤੇ ਟੈਂਪਲੇਟ ਦੇ ਮੈਂਬਰਾਂ ਲਈ ਡਿਸਪੈਂਚਰ ਫੰਕਸ਼ਨਾਂ ਨੂੰ ਲਾਗੂ ਕਰਨ ਲਈ ਮਾਡਰਨ ਅਤੇ ਮੁੜ ਵਰਤੋਂ ਯੋਗ ਪਹੁੰਚ ਦੀ ਖੋਜ ਕਰਦਾ ਹੈ.
#include <iostream>
#include <tuple>
#include <utility>
template <typename... Types>
struct A {
template <typename T>
void a() {
std::cout << "Function a with type: " << typeid(T).name() << std::endl;
}
template <typename T>
void b() {
std::cout << "Function b with type: " << typeid(T).name() << std::endl;
}
template <template <typename> class Fn, typename Tuple, std::size_t... Is>
void for_each_type_impl(std::index_sequence<Is...>) {
(Fn<std::tuple_element_t<Is, Tuple>>::invoke(*this), ...);
}
template <template <typename> class Fn>
void for_each_type() {
using Tuple = std::tuple<Types...>;
for_each_type_impl<Fn, Tuple>(std::make_index_sequence<sizeof...(Types)>{});
}
};
template <typename T>
struct FnA {
static void invoke(A<char, int, float> &obj) {
obj.a<T>();
}
};
template <typename T>
struct FnB {
static void invoke(A<char, int, float> &obj) {
obj.b<T>();
}
};
int main() {
A<char, int, float> obj;
obj.for_each_type<FnA>();
obj.for_each_type<FnB>();
return 0;
}
ਵੱਖ-ਵੱਖ ਟੈਂਪਲੇਟਸ ਅਤੇ ਲਾਂਡਾ ਫੰਕਸ਼ਨਾਂ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਵਿਕਲਪਕ ਪਹੁੰਚ
ਇਹ ਹੱਲ ਬਿਹਤਰ ਲਚਕਤਾ ਅਤੇ ਘੱਟੋ ਘੱਟ ਬਾਇਲਰਪਲੇਟ ਲਈ ਲਾਂਬਦਾ ਫੰਕਸ਼ਨਾਂ ਅਤੇ ਵੇਰੀਏਡੀਆ ਟੈਂਪਲੇਟਸ ਦੀ ਵਰਤੋਂ ਨਾਲ ਵਧੇਰੇ ਸੰਖੇਪ ਪਹੁੰਚ ਪ੍ਰਦਰਸ਼ਿਤ ਕਰਦਾ ਹੈ.
#include <iostream>
#include <tuple>
template <typename... Types>
struct A {
template <typename T>
void a() {
std::cout << "Function a with type: " << typeid(T).name() << std::endl;
}
template <typename T>
void b() {
std::cout << "Function b with type: " << typeid(T).name() << std::endl;
}
template <typename Fn>
void for_each_type(Fn fn) {
(fn.template operator()<Types>(*this), ...);
}
};
int main() {
A<char, int, float> obj;
auto call_a = [](auto &self) {
self.template a<decltype(self)>();
};
auto call_b = [](auto &self) {
self.template b<decltype(self)>();
};
obj.for_each_type(call_a);
obj.for_each_type(call_b);
return 0;
}
ਐਡਵਾਂਸਡ ਸੀ ++ ਤਕਨੀਕਾਂ ਨਾਲ ਟੈਂਪਲੇਟ ਫੰਕਸ਼ਨ ਨੂੰ ਅਨੁਕੂਲ ਬਣਾਉਣਾ
C ++ ਵਿਚ ਟੈਂਪਲੇਟ ਫੰਕਸ਼ਨ ਦਾ ਡਿਜ਼ਾਇਨ ਕਰਨ ਦੇ ਘੱਟ-ਪਿਕਚਰਡ ਪਹਿਲੂ ਇਕ ਲਾਗੂ ਕੀਤੇ ਲਾਗੂ ਕਰਨ ਨੂੰ ਯਕੀਨੀ ਬਣਾਉਣ ਲਈ ਭਵਿੱਖ ਨੂੰ ਲਚਕਤਾ ਯਕੀਨੀ ਬਣਾ ਰਿਹਾ ਹੈ. ਲਵਿੰਗ ਵਿਚ ਪਥਰਾਅ ਵੇਰੀਡੀਆ ਟੈਂਪਲੇਟਸ ਦੇ ਨਾਲ. ਟੈਂਪਲੇਟ ਮਾਹਰ ਤੁਹਾਨੂੰ ਕੁਝ ਕਿਸਮਾਂ ਲਈ ਖਾਸ ਵਿਵਹਾਰ ਨੂੰ ਤਿਆਰ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ, ਜੋ ਵਿਸ਼ੇਸ਼ ਤੌਰ ਤੇ ਲਾਭਦਾਇਕ ਹੁੰਦਾ ਹੈ ਜਦੋਂ ਕੁਝ ਕਿਸਮਾਂ ਨੂੰ ਕਸਟਮ ਤਰਕ ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ. ਇਸ ਨੂੰ ਡਿਸਪੈਚਰ ਫੰਕਸ਼ਨ ਨਾਲ ਜੋੜ ਕੇ, ਤੁਸੀਂ ਇਕ ਹੋਰ ਮਜ਼ਬੂਤ ਅਤੇ ਐਕਸਟੈਂਸੀਬਲ ਸਿਸਟਮ ਬਣਾ ਸਕਦੇ ਹੋ ਜੋ ਗਤੀਸ਼ੀਲ ਤੌਰ ਤੇ ਨਵੀਆਂ ਜ਼ਰੂਰਤਾਂ ਨੂੰ ਬਦਲਦਾ ਹੈ.
ਇਕ ਹੋਰ ਵਿਚਾਰ ਇਕ ਸੰਕੁਚਿਤ ਸਮੇਂ ਦੀਆਂ ਗਲਤੀਆਂ ਸੰਭਾਲ ਰਿਹਾ ਹੈ. ਗੁੰਝਲਦਾਰ ਟੈਂਪਲੇਟਸ ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਸਮੇਂ, ਇਕ ਆਮ ਮੁੱਦਾ ਕ੍ਰਿਪਟਿਕ ਗਲਤੀ ਸੰਦੇਸ਼ ਹੁੰਦਾ ਹੈ ਜੋ ਡੀਬੱਗਿੰਗ ਮੁਸ਼ਕਲ ਬਣਾਉਂਦੇ ਹਨ. ਇਸ ਨੂੰ ਘਟਾਉਣ ਲਈ, ਧਾਰਨਾਵਾਂ ਜਾਂ Sfinae (ਬਦਲ ਦੀ ਅਸਫਲਤਾ ਕੋਈ ਗਲਤੀ ਨਹੀਂ) ਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ. ਸੰਕਲਪਾਂ, C ++ 20 ਵਿੱਚ ਪੇਸ਼ ਕੀਤੀਆਂ ਜਾਂਦੀਆਂ ਹਨ, ਡਿਵੈਲਪਰਾਂ ਨੂੰ ਟੈਂਪਲੇਟਸ ਨੂੰ ਲੰਘਾਉਣ ਦੀ ਆਗਿਆ ਦਿਓ, ਇਹ ਸੁਨਿਸ਼ਚਿਤ ਕਰਦੇ ਹਨ ਕਿ ਡਿਸਪੈਸਚਰ ਵਿੱਚ ਸਿਰਫ ਯੋਗ ਕਿਸਮਾਂ ਦੀ ਵਰਤੋਂ ਕੀਤੀ ਜਾਂਦੀ ਹੈ. ਇਸ ਦੇ ਨਤੀਜੇ ਵਜੋਂ ਕਲੀਨਰ ਗਲਤੀ ਸੁਨੇਹੇ ਅਤੇ ਵਧੀਆ ਕੋਡ ਸਪਸ਼ਟਤਾ ਹੁੰਦੀ ਹੈ. ਇਸ ਤੋਂ ਇਲਾਵਾ, sfinae ਅਸਮਰਥਿਤ ਕਿਸਮਾਂ ਲਈ ਫਾਲਬੈਕ ਸਥਾਪਨ ਕਰ ਸਕਦਾ ਹੈ, ਇਹ ਸੁਨਿਸ਼ਚਿਤ ਕਰਨਾ ਕਿ ਜਦੋਂ ਕਿਨਾਰੇ ਦੇ ਕੇਸ ਸਾਹਮਣੇ ਆਉਂਦੇ ਸਨ.
ਅੰਤ ਵਿੱਚ, ਇਹ ਟੈਂਪਲੇਟ ਮੈਟਾਪ੍ਰਿੰਗ ਦੇ ਪ੍ਰਦਰਸ਼ਨ ਦੇ ਪ੍ਰਭਾਵ ਨੂੰ ਧਿਆਨ ਵਿੱਚ ਰੱਖਣਾ ਮਹੱਤਵਪੂਰਣ ਹੈ. ਕਿਉਂਕਿ ਇਸ ਲਈ ਬਹੁਤ ਸਾਰੀਆਂ ਕੰਪਨੀਆਂ ਕੰਪਾਇਲ ਸਮੇਂ ਹੁੰਦੀਆਂ ਹਨ ਜਿਵੇਂ ਕਿ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਜਿਵੇਂ ਕਿ `suple` ਜਾਂ ਫੋਲਡ ਸਮੀਕਰਨਾਂ ਨੂੰ ਆਮ ਸਮੇਂ ਵਿੱਚ ਵਾਧਾ ਕਰ ਸਕਦਾ ਹੈ, ਖ਼ਾਸਕਰ ਹੁੰਦਾ ਹੈ. ਇਸ ਨੂੰ ਹੱਲ ਕਰਨ ਲਈ, ਡਿਵੈਲਪਰ ਵੱਖਰੇ ਤਰਕ ਨਾਲ ਨਿਰਭਰਤਾ ਨੂੰ ਛੋਟੇ, ਮੁੜ ਵਰਤੋਂ ਵਾਲੇ ਟੈਂਪਲੇਟ ਜਾਂ ਸੀਮਿਤ ਕਰਨ ਵਾਲੀਆਂ ਕਿਸਮਾਂ ਦੀ ਗਿਣਤੀ ਨੂੰ ਸੀਮਿਤ ਕਰ ਸਕਦੇ ਹਨ. ਸਕੇਲੈਬਲ c ++ ਕਾਰਜਾਂ ਨੂੰ ਚਲਾਉਣਾ ਕਾਰਜਸ਼ੀਲਤਾ ਅਤੇ ਕੰਪਾਈਲ-ਟਾਈਮ ਕੁਸ਼ਲਤਾ ਵਿਚਕਾਰ ਇਹ ਸੰਤੁਲਨ ਹੈ. 🚀
- ਵਰਤਣ ਦਾ ਉਦੇਸ਼ ਕੀ ਹੈ ਇਨ੍ਹਾਂ ਸਕ੍ਰਿਪਟਾਂ ਵਿੱਚ?
- ਕੰਪਾਈਲ ਟਾਈਮ ਤੇ ਕਿਸਮਾਂ ਦੇ ਕ੍ਰਮ ਤੇ ਸਟੋਰ ਕਰਨ ਅਤੇ ਦੁਹਰਾਉਣ ਲਈ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ, ਸਿਰਫ ਦੁਹਰਾਓ ਦੇ ਅਨੁਕੂਲ ਕਾਰਜਾਂ ਨੂੰ ਸਮਰੱਥ ਕਰਨ ਲਈ.
- ਕਿਵੇਂ ਹੁੰਦਾ ਹੈ ਟੈਂਪਲੇਟ ਦੁਹਰਾਓ ਨੂੰ ਸਰਲ ਬਣਾਓ?
- , C ++ 17 ਵਿੱਚ ਪੇਸ਼ ਕੀਤਾ ਗਿਆ, ਇੱਕ ਪੈਰਾਮੀਟਰ ਪੈਕ ਨੂੰ ਘੱਟੋ ਘੱਟ ਸਿੰਟੈਕਸ ਪੈਕ ਤੇ ਬਾਇਲਰ ਪਲੇਟ ਕੋਡ ਨੂੰ ਘਟਾਉਣ ਲਈ ਇੱਕ ਪੈਰਾਮੀਟਰ ਪੈਕ ਤੇ ਆਗਿਆ ਦੇਣਾ (ਇੱਕ ਫੰਕਸ਼ਨ ਕਾਲ ਕਰੋ).
- ਸਫਾਈਨ ਕੀ ਹੈ ਅਤੇ ਇੱਥੇ ਇਹ ਕਿਵੇਂ ਲਾਭਦਾਇਕ ਹੈ?
- SFinae, ਜਾਂ "ਤਬਦੀਲੀ ਦੀ ਅਸਫਲਤਾ ਕੋਈ ਗਲਤੀ ਨਹੀਂ ਹੈ," ਜਦੋਂ ਕੁਝ ਕਿਸਮਾਂ ਜਾਂ ਸ਼ਰਤਾਂ ਪੂਰੀਆਂ ਨਹੀਂ ਹੁੰਦੀਆਂ, ਲਚਕ ਨੂੰ ਵਧਾਉਂਦੀਆਂ ਹਨ.
- ਕੀ ਇਹ ਪਹੁੰਚ ਵਿਸ਼ੇਸ਼ ਕਿਸਮਾਂ ਲਈ ਕਸਟਮ ਤਰਕ ਨੂੰ ਸੰਭਾਲ ਸਕਦਾ ਹੈ?
- ਹਾਂ, ਵਰਤ ਕੇ , ਤੁਸੀਂ ਇਕੋ ਭੇਜਣ ਵਾਲੇ ਫਰੇਮਵਰਕ ਦੀ ਵਰਤੋਂ ਕਰਦਿਆਂ ਅਜੇ ਵੀ ਖਾਸ ਕਿਸਮਾਂ ਲਈ ਕਸਟਮ ਵਿਵਹਾਰ ਨੂੰ ਪਰਿਭਾਸ਼ਤ ਕਰ ਸਕਦੇ ਹੋ.
- ਮੈਂ ਗੁੰਝਲਦਾਰ ਟੈਂਪਲੇਟ ਦੀਆਂ ਗਲਤੀਆਂ ਨੂੰ ਡੀਬੱਗ ਕਰ ਸਕਦਾ ਹਾਂ?
- ਦੀ ਵਰਤੋਂ (C ++ 20) ਜਾਂ ਸਥਿਰ ਦਾਅਵੇ ਦੀਆਂ ਕਿਸਮਾਂ ਨੂੰ ਪ੍ਰਮਾਣਿਤ ਕਰਨ ਵਿੱਚ ਸਹਾਇਤਾ ਕਰ ਸਕਦੇ ਹਨ ਅਤੇ ਸੰਕਲਨ ਦੇ ਦੌਰਾਨ ਸਾਫ ਗਲਤੀ ਸੁਨੇਹੇ ਪ੍ਰਦਾਨ ਕਰ ਸਕਦੇ ਹਨ.
ਮਲਟੀਪਲ ਟੈਂਪਲੇਟ ਦੇ ਨਾਲ ਕੰਮ ਕਰਨ ਦੇ ਕੰਮ ਕਰਨ ਵੇਲੇ ਬਾਇਲਰ ਪਲੇਟ ਕੋਡ ਨੂੰ ਘਟਾਉਣ ਦੀ ਚੁਣੌਤੀ ਨੂੰ ਡਿਸਪੈਚਰ ਫੰਕਸ਼ਨ ਦੀ ਵਰਤੋਂ ਨਾਲ ਪ੍ਰਭਾਵਸ਼ਾਲੀ sted ੰਗ ਨਾਲ ਹੱਲ ਕੀਤਾ ਜਾਂਦਾ ਹੈ. ਸਵੈਚਾਲਿਤ ਦੁਆਰਾ ਆਟੋਮੈਟਿਕ ਕਿਸਮਾਂ ਦੀਆਂ ਮੰਗਾਂ ਲਈ ਕਾਲਾਂ, ਡਿਵੈਲਪਰ ਕਲੀਨਰ ਅਤੇ ਵਧੇਰੇ ਪ੍ਰਬੰਧਯੋਗ ਕੋਡ ਲਿਖ ਸਕਦੇ ਹਨ. ਇਹ ਪਹੁੰਚ ਨਾ ਸਿਰਫ ਸਮਾਂ ਬਚਾਉਂਦੀ ਹੈ ਬਲਕਿ ਫੰਕਸ਼ਨ ਕਾਲਾਂ ਵਿੱਚ ਇਕਸਾਰਤਾ ਨੂੰ ਵੀ ਯਕੀਨੀ ਬਣਾਉਂਦੀ ਹੈ.
ਵਰਗੀਆਂ ਤਕਨੀਕਾਂ ਦੁਆਰਾ , ਵਾਈਲਡਿਕ ਟੈਂਪਲੇਟਸ ਅਤੇ ਸੰਕਲਪਾਂ, ਇਹ ਸਕ੍ਰਿਪਟਾਂ ਦਰਸਾਉਂਦੀਆਂ ਹਨ ਕਿ ਜਦੋਂ ਕਿ ਪ੍ਰਬੰਧਨਯੋਗ ਪ੍ਰਬੰਧਨਯੋਗ ਹੈ. ਕਈ ਕਿਸਮਾਂ ਦੇ ਦ੍ਰਿਸ਼ਾਂ ਵਿੱਚ ਪ੍ਰੈਕਟੀਰੀਓਸ ਵਿੱਚ ਅਮਲੀ ਉਪਯੋਗਾਂ ਦੇ ਨਾਲ, ਇਹ method ੰਗ ਆਧੁਨਿਕ ਸੀ ++ ਪ੍ਰੋਗਰਾਮਿੰਗ ਦੀ ਲਚਕਤਾ ਅਤੇ ਸ਼ਕਤੀ ਪ੍ਰਦਰਸ਼ਿਤ ਕਰਦਾ ਹੈ. 🛠️
- C ++ ਟੈਂਪਲੇਟਸ ਅਤੇ ਮੈਟਾਪ੍ਰਿੰਗ ਬਾਰੇ ਵੇਰਵੇ ਅਧਿਕਾਰਤ ਸੀ ++ ਦਸਤਾਵੇਜ਼ਾਂ ਤੋਂ ਦਰਸਾਇਆ ਗਿਆ ਸੀ. ਸਰੋਤ ਤੇ ਜਾਓ: C ++ ਹਵਾਲਾ .
- ਵਾਈਲਡਿਕ ਟੈਂਪਲੇਟਸ ਅਤੇ ਫੋਲਡ ਸਮੀਕਰਨ ਲਈ ਉੱਨਤ ਤਕਨੀਕਾਂ ਪ੍ਰਸਿੱਧ ਡਿਵੈਲਪਰ ਫੋਰਮ ਦੀਆਂ ਉਦਾਹਰਣਾਂ ਦੁਆਰਾ ਪ੍ਰੇਰਿਤ ਸਨ: ਸਟੈਕ ਓਵਰਫਲੋ .
- ਵਿਦਿਅਕ ਪਲੇਟਫਾਰਮ ਤੋਂ ਸਮੱਗਰੀ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਸੰਕਲਪਾਂ ਅਤੇ ਸਫਾਈਨ ਦੀਆਂ ਤਕਨੀਕਾਂ ਦੀ ਖੋਜ ਕੀਤੀ ਗਈ ਸੀ: ਮਾਈਕਰੋਸੌਫਟ - ਸੀ ++ .