मैंने इस उद्देश्य के लिए Lamda2Delegate संरचना लिखी। वास्तव में यह किसी भी .net प्रतिनिधि को सी ++ 11 लैम्ब्डा को परिवर्तित करता है।
उपयोग के उदाहरण:
Thread^ TestLambaWrapper()
{
gcroot<String ^> str = "Testext";
int i = 12345;
Thread^ newThread = gcnew Thread(
Lambda2Delegate<ParameterizedThreadStart>() = [&, str](Object^str2)
{
Sleep(2000);
Console::WriteLine("Thread output = {0} {1} {2}", str, i, str2);
}
);
newThread->Start("Nahnah");
return newThread;
}
अपने मामले के लिए:
gcroot<A^> a = gcnew A();
Func<A^>^aFunc = Lambda2Delegate<>() = [a](){ return (A^)a; };
auto a2 = aFunc();
कामयाब कक्षाएं आप उन्हें gcroot के साथ रैप करने की जरूरत पर कब्जा करने के लिए, और मूल्य द्वारा स्पष्ट रूप से कब्जा।
और Lambda2Delegate।ज ही
#pragma once
#ifdef _MANAGED
struct AutoDetectDelegateType {};
template<typename TDelegate, typename TLambda, typename TRet, typename ...TParams>
ref class LambdaHolder;
template<typename TDelegate, typename TLambda, typename TRet, typename ...TParams>
ref class LambdaHolder
{
public:
inline LambdaHolder(const TLambda % func) { m_func = new TLambda(func); }
!LambdaHolder() { delete m_func; }
~LambdaHolder() { !LambdaHolder(); }
public:
TRet Callback(TParams... params) { return (*m_func)(params...); }
operator TDelegate ^() { return gcnew TDelegate(this, &LambdaHolder::Callback); }
private:
TLambda * m_func;
};
template<typename TLambda, typename TRet, typename ...TParams>
ref class LambdaHolder<AutoDetectDelegateType, TLambda, TRet, TParams...>
{
public:
inline LambdaHolder(const TLambda % func) { m_func = new TLambda(func); }
!LambdaHolder() { delete m_func; }
~LambdaHolder() { !LambdaHolder(); }
public:
TRet Callback(TParams... params) { return (*m_func)(params...); }
template<typename TDelegate>
operator TDelegate ^() { return gcnew TDelegate(this, &LambdaHolder::Callback); }
private:
TLambda * m_func;
};
template <typename TDelegate, typename TLambda>
struct get_labmda_holder : public get_labmda_holder < TDelegate, decltype(&TLambda::operator()) > {};
template <typename TDelegate, typename TLambda, typename TRet, typename... TParams>
struct get_labmda_holder < TDelegate, TRet(__clrcall TLambda::*)(TParams...) const >
{
typedef LambdaHolder<TDelegate, TLambda, TRet, TParams...> TLambdaHolder;
};
template <typename TDelegate, typename TLambda, typename TRet, typename... TParams>
struct get_labmda_holder < TDelegate, TRet(__clrcall TLambda::*)(TParams...) >
{
typedef LambdaHolder<TDelegate, TLambda, TRet, TParams...> TLambdaHolder;
};
template <typename TDelegate, typename TLambda, typename TRet, typename... TParams>
struct get_labmda_holder < TDelegate, TRet(__thiscall TLambda::*)(TParams...) const >
{
typedef LambdaHolder<TDelegate, TLambda, TRet, TParams...> TLambdaHolder;
};
template <typename TDelegate, typename TLambda, typename TRet, typename... TParams>
struct get_labmda_holder < TDelegate, TRet(__thiscall TLambda::*)(TParams...)>
{
typedef LambdaHolder<TDelegate, TLambda, TRet, TParams...> TLambdaHolder;
};
template<typename TDelegate = AutoDetectDelegateType>
struct Lambda2Delegate
{
template<typename TLambda>
typename get_labmda_holder<TDelegate, TLambda>::TLambdaHolder^operator = (const TLambda % func)
{
return gcnew get_labmda_holder<TDelegate, TLambda>::TLambdaHolder(func);
}
};
#endif
अद्यतन: यह कामयाब सदस्य समारोह के अंदर C++ लैम्ब्डा समारोह की घोषणा करने के लिए संभव नहीं है, लेकिन वैकल्पिक हल नहीं है - स्थिर सदस्य समारोह का उपयोग करें:
ref class S
{
public:
int F(System::String^str)
{
return F(this, str);
}
private:
//static function declaring c++ lambda
static int F(S^pThis, System::String^str)
{
gcroot<System::String ^> localStr = "local string";
System::Func<System::String ^, int>^func = Lambda2Delegate<>() = [=](System::String^str)
{
System::Console::WriteLine(str);
System::Console::WriteLine(localStr);
return str->Length;
};
return func(str);
}
};
यह बहुत अच्छा है। धन्यवाद –
मैं विजुअल स्टूडियो 2012 के साथ Lambda2Delegate.h का निर्माण नहीं कर सकता। विविध टेम्पलेट्स के साथ समस्या: 'त्रुटि C2143: वाक्यविन्यास त्रुटि: अनुपलब्ध', 'पहले' ... '\t ' – slater
समस्या मिली http://stackoverflow.com/ प्रश्न/13238408/variadic-template-in-vs-2012-visual-c-november-2012-ctp – slater