Lambdaをコールバックとして渡す必要があります(特にWinAPIの場合)。アイデアは次のとおりです。
ラムダをシングルトンクラスに格納する(すべてのラムダ、2つの同一のものも異なるタイプを持つ)ので、安全である必要があります
LambdaSingleton<Lambda_Type>::instance = l;
ラムダインスタンスを呼び出す静的メソッドのアドレスをコールバックとして渡します。
template < typename Lambda, typename Callback_Signature_R, typename... Callback_Signature_Args> struct LambdaCallbackSupport{ /** * Callback method * * @param args * The parameters to feed to the lambda * @return * The return value of the execution of the lambda */ static Callback_Signature_R __stdcall callback(Callback_Signature_Args... args){ return LambdaSingleton<Lambda>::instance(args); } };
コンパイル時に関数に関する情報を抽出するための作業クラスがすでにあります。
template<
typename C,
typename R,
typename... Args>
struct Traits<R(__stdcall *)(Args...) const>{
//various typedefs for R, tuple of args, arity etc..
};
だから私はこのようなものを手に入れるでしょう:
//Example lambda
int toBeCaptured = 8;
auto lambda =
[&](std::string& str) -> size_t{
return toBeCaptured + str.length();
};
typedef decltype(lambda) Lambda;
//Expected callback signature
typedef size_t(__stdcall *CallbackSignature)(std::string&);
//Configure a callback support and pass its method
typedef Traits<CallbackSignature> callbackTraits;
typedef LambdaCallbackSupport<
Lambda,
callbackTraits::Result_Type,
callbackTraits::Args_Tuple_Pack> CallbackSupportType;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //How to unpack the tuple without actually have the arguments??
//Store the lambda instance statically
Singleton<Lambda>::instance = lambda;
//Pass the callback
void* pFunc = &CallbackSupportType::callback;
//Simulate invocation of callback
std::string str("may work?");
size_t ret = (*pFunc)(str);
コンパイラにコールバッククラスの特殊化を生成させるだけでよいので(実際にはそのメソッドを呼び出さないでください)、このサイトの他の質問で提案されている反復アンパック手法をどのように適用できますか?
ありがとうございました