मैं C ++ टेम्प्लेट को पास करने के नियमों को तर्क के रूप में देख रहा हूं।
यह C ++ द्वारा समर्थित है जैसा कि यहां एक उदाहरण द्वारा दिखाया गया है:
#include <iostream>
void add1(int &v)
{
v+=1;
}
void add2(int &v)
{
v+=2;
}
template <void (*T)(int &)>
void doOperation()
{
int temp=0;
T(temp);
std::cout << "Result is " << temp << std::endl;
}
int main()
{
doOperation<add1>();
doOperation<add2>();
}
हालाँकि इस तकनीक के बारे में सीखना मुश्किल है। "टेम्पलेट तर्क के रूप में फ़ंक्शन" के लिए गुग्लिंग करने से बहुत कुछ नहीं होता है। और क्लासिक सी ++ टेम्पलेट्स पूरी गाइड आश्चर्यजनक रूप से भी इस पर चर्चा नहीं करती है (कम से कम मेरी खोज से नहीं)।
मेरे पास प्रश्न हैं कि क्या यह वैध C ++ है (या सिर्फ कुछ व्यापक रूप से समर्थित विस्तार)।
इसके अलावा, इस तरह के टेम्प्लेट आह्वान के दौरान स्पष्ट कार्यों के साथ एक ही हस्ताक्षर के साथ एक फ़ंक्टर को अनुमति देने का एक तरीका है?
उपरोक्त प्रोग्राम में निम्न कार्य नहीं करता है , कम से कम विजुअल C ++ में , क्योंकि वाक्य रचना स्पष्ट रूप से गलत है। किसी फ़ंक्टर और इसके विपरीत किसी फ़ंक्शन को स्विच करने में सक्षम होना अच्छा होगा, जिस तरह से आप एक फ़ंक्शन पॉइंटर या फ़ंक्टर को std :: सॉर्ट एल्गोरिथ्म में पास कर सकते हैं यदि आप एक कस्टम तुलना ऑपरेशन को परिभाषित करना चाहते हैं।
struct add3 {
void operator() (int &v) {v+=3;}
};
...
doOperation<add3>();
एक वेब लिंक या दो, या C ++ टेम्प्लेट बुक में एक पृष्ठ की ओर इशारा किया जाएगा!
-std=gnu++17
। क्या मैं फ़ंक्शन पॉइंटर टेम्पलेट नॉन-टाइप तर्क के रूप में C ++ 17 कैप्चरलेस लैम्ब्डा कॉन्स्ट्रेप रूपांतरण ऑपरेटर के परिणाम का उपयोग कर सकता हूं? ।