लैम्ब्डास के साथ खेलना मुझे एक दिलचस्प व्यवहार मिला जो मैं पूरी तरह समझ नहीं पा रहा हूं।लेम्बा आधार कक्षाओं के रूप में कार्य करता है
मान लीजिए मेरे पास struct Overload
है जो 2 टेम्पलेट पैरामीटर से प्राप्त होता है, और इसमें using F1::operator();
क्लॉज है।
अब अगर मैं दो functors से निकाले जाते हैं मैं सिर्फ एफ 1 के ऑपरेटर() (के रूप में मैं उम्मीद होती है)
अगर मैं दो Lambda प्रकार्य अब यह सच है से निकाले जाते हैं पहुँच सकते हैं: मैं ऑपरेटर पहुंच सकते हैं () एफ 2 से भी।
#include <iostream>
// I compiled with g++ (GCC) 4.7.2 20121109 (Red Hat 4.7.2-8)
//
// g++ -Wall -std=c++11 -g main.cc
// g++ -Wall -std=c++11 -DFUNCTOR -g main.cc
//
// or clang clang version 3.3 (tags/RELEASE_33/rc2)
//
// clang++ -Wall -std=c++11 -g main.cc
// clang++ -Wall -std=c++11 -DFUNCTOR -g main.cc
//
// on a Linux localhost.localdomain 3.9.6-200.fc18.i686 #1 SMP Thu Jun 13
// 19:29:40 UTC 2013 i686 i686 i386 GNU/Linux box
struct Functor1
{
void operator()() { std::cout << "Functor1::operator()()\n"; }
};
struct Functor2
{
void operator()(int) { std::cout << "Functor2::operator()(int)\n"; }
};
template <typename F1, typename F2>
struct Overload : public F1, public F2
{
Overload()
: F1()
, F2() {}
Overload(F1 x1, F2 x2)
: F1(x1)
, F2(x2) {}
using F1::operator();
};
template <typename F1, typename F2>
auto get(F1 x1, F2 x2) -> Overload<F1, F2>
{
return Overload<F1, F2>(x1, x2);
}
int main(int argc, char *argv[])
{
auto f = get(Functor1(), Functor2());
f();
#ifdef FUNCTOR
f(2); // this one doesn't work IMHO correctly
#endif
auto f1 = get(
[]() { std::cout << "lambda1::operator()()\n"; },
[](int) { std::cout << "lambda2::operator()(int)\n"; }
);
f1();
f1(2); // this one works but I don't know why
return 0;
}
मानक कहा गया है कि:
हैलैम्ब्डा अभिव्यक्ति के प्रकार (जो भी बंद वस्तु के प्रकार है) एक अद्वितीय, अनाम गैर संघ वर्ग प्रकार
तो हर Lambda के प्रकार अद्वितीय होना चाहिए।
मैं व्याख्या नहीं कर सकते यह क्यों इतना है: किसी को भी इस पर कुछ प्रकाश डाला सकता है कृपया?
स्टैक ओवरफ़्लो में आपका स्वागत है, बहुत अच्छा प्रश्न: यह
Overload
वर्ग है कि 'जादुई' सभी lambdas से निकला है और उजागर करता है इसीoperator()
है! – Matबहुत अधिक। हम एक कठिन भीड़ हैं और आपने अभी हमें बहुत सी चीजें सिखाई हैं। – zneak