私は最近、この気の利いたスニペットをWebで見つけました。これにより、明示的なプレースホルダーを渡さなくてもバインドできます。
template <typename ReturnType, typename... Args>
std::function<ReturnType(Args...)>
easy_bind(ReturnType(*MemPtr)(Args...))
{
return [=]( Args... args ) -> ReturnType { return (*MemPtr)( args... ); };
}
このバージョンは、引数なしでうまく機能します。
auto f1 = easy_bind( (std::string(*)(A&,A&))&Worker::MyFn );
後で呼び出されます:
std::string s = f1( *p_a1, *p_a2 );
質問
最大n個の引数で動作するようにコードを変更して、2-n(この場合)にプレースホルダーを入力することは可能ですか?たとえば、これには1つのプレースホルダーが必要です。
auto f2 = easy_bind( (std::string(*)(A&,A&))&Worker::MyFn, *p_a1 );
後で呼び出されます:
std::string s = f2( *p_a2 );
ボーナス
最終的には、このようなもの(最後のプレースホルダーを使い果たすため、プレースホルダーを挿入しない)があると便利ですが、この実装では機能しないと思います(署名のパターンマッチングはできないと思います)。
auto f3 = easy_bind( f2, *p_a2 );
後で呼び出されます:
std::string s = f3();
肝心なのは、プレースホルダーを配置する必要のないバージョンのバインドがあると便利です。これは、一般的なTMPコードで非常に役立ちます。