मैंने एक टेम्पलेट कोड लिखा है जो एक मज़ेदार को तर्क के रूप में लेता है और कुछ प्रसंस्करण के बाद इसे निष्पादित करता है। यद्यपि कोई और उस कार्य को एक लैम्ब्डा, एक फ़ंक्शन पॉइंटर या यहां तक कि std::function
पास कर सकता है लेकिन यह मुख्य रूप से लैम्ब्डा के लिए है (नहीं कि मैं अन्य प्रारूपों पर प्रतिबंध लगाता हूं)। मैं पूछना चाहता हूं कि मुझे उस लैम्ब्डा को कैसे लेना चाहिए - मूल्य से? संदर्भ से? या कुछ और।तर्क के रूप में lambda गुजर रहा है - संदर्भ या मूल्य से?
उदाहरण कोड -
template<typename Functor>
void f(Functor functor)
template<typename Functor>
void f(Functor &functor)
template<typename Functor>
void f(Functor &&functor)
बेहतर तरीका और क्या और क्यों हो सकता है -
#include <iostream>
#include <functional>
using namespace std;
template<typename Functor>
void f(Functor functor)
{
functor();
}
void g()
{
cout << "Calling from Function\n";
}
int main()
{
int n = 5;
f([](){cout << "Calling from Temp Lambda\n";});
f([&](){cout << "Calling from Capturing Temp Lambda\n"; ++n;});
auto l = [](){cout << "Calling from stored Lambda\n";};
f(l);
std::function<void()> funcSTD = []() { cout << "Calling from std::Function\n"; };
f(funcSTD);
f(g);
}
उपरोक्त कोड में, मैं यह इनमें से किसी बनाने का एक विकल्प है? क्या इनमें से किसी के लिए कोई सीमाएं हैं?
आईएमएचओ, मूल्य से गुजरता है। – NathanOliver
मैंने हमेशा मूल्य से गुजरने वाले फंक्चर टेम्पलेटेड ऑब्जेक्ट्स को देखा है, लेकिन मुझे नहीं पता क्यों; अच्छा प्रश्न। – YSC
संबंधित/डुप्ले: http://stackoverflow.com/questions/8196345/passing-functor-object-by-value-vs-by-reference-c – NathanOliver