std::function
का उपयोग करके, हम argument_type
, second_argument_type
आदि टाइपिंगफ्स का उपयोग करके तर्क का प्रकार प्राप्त कर सकते हैं, लेकिन मुझे लैम्ब्स के साथ एक ही चीज़ करने का कोई तरीका नहीं दिख रहा है। क्या यह संभव है?क्या हम लैम्ब्डा तर्क का प्रकार प्राप्त कर सकते हैं?
template<typename F>
static void forward(F f)
{
// Create an object of the type of the first
// parameter to the function object F
typedef typename F::argument_type T;
T t;
//...do something with 't' here (deserialize in my case)
// Forward the object to the function
f(t);
}
यह इस और सब कुछ की तरह इस्तेमाल किया जा सकता है: (मैं VS2010 उपयोग कर रहा हूँ)
मैं अपने अक्रमांकन एक वस्तु पढ़ सकते हैं और यह एक सेटर कार्य करने के लिए पारित करने के लिए इस्तेमाल किया प्रणाली में निम्नलिखित की तरह कुछ चाहते कहो ठीक काम करता है:
std::function<void(int)> f = [](int i) -> void { setValue(i); };
forward(f);
लेकिन यह सीधे lambdas साथ काम नहीं करेंगे:
forward([](int i) -> void { setValue(i); });
//error C2039: 'argument_type' : is not a
//member of '`anonymous-namespace'::<lambda1>'
क्या पैरामीटर प्रकारों को इस तरह से एक्सेस करने का कोई तरीका है जो लैम्बडास और std::function
ऑब्जेक्ट्स दोनों के लिए काम करेगा? हो सकता है कि std::function
पहले लैम्ब्डा का प्रकार प्राप्त करें, और उसके बाद argument_type
?
नीचे जवाब है, एक ऐसा संस्करण है और std::function
lambdas के साथ काम करता से इसे जारी रखते हुए है:
template<typename T, typename F>
static void forward(F f)
{
T t;
//...do something with 't' here (deserialize in my case)
f(t);
}
forward<int>([](int i) -> void { setValue(i); });
int
के बाद से यहां दोहराया है मैं इसे से छुटकारा पाने की उम्मीद कर रहा था - तो int
के लिए बुरा नहीं लेकिन कुछ नामस्थानों में लंबे नाम वाले प्रकारों के लिए अधिक परेशान। C'est ला vie!
संक्षिप्त उत्तर: नहीं। – ildjarn
लंबा उत्तर: हाँ, नीचे देखें। –