यहां एक समाधान है जिसमें एक संरचना में लांबा को लपेटना शामिल है:
template <typename T>
struct LamT
{
static void Go()
{
auto lam = []()
{
T var;
std::cout << "lam, type = " << typeid(var).name() << std::endl;
};
lam();
}
};
उपयोग करने के लिए:
LamT<int>::Go();
LamT<char>::Go();
#This prints
lam, type = i
lam, type = c
इसके साथ मुख्य मुद्दा (अतिरिक्त टाइपिंग के अलावा) आप इस संरचना की परिभाषा को किसी अन्य विधि के अंदर एम्बेड नहीं कर सकते हैं या आपको मिल सकता है (gcc 4.9)
error: a template declaration cannot appear at block scope
मैंने भी ऐसा करने की कोशिश की:
template <typename T> using LamdaT = decltype(
[](void)
{
std::cout << "LambT type = " << typeid(T).name() << std::endl;
});
इस आशा के साथ कि मैं इसका इस तरह उपयोग कर सकता हूं:
LamdaT<int>();
LamdaT<char>();
लेकिन मुझे संकलक त्रुटि मिलती है:
error: lambda-expression in unevaluated context
तो यह काम नहीं करता है ... लेकिन अगर यह संकलित करता है, तो यह सीमित उपयोग का होगा क्योंकि हमें अभी भी फाइल स्कोप पर "लैमडाट का उपयोग करना" पड़ेगा (क्योंकि यह एक टेम्प्लेट है) जो इस तरह के उद्देश्य को हरा देता है lambdas।