I recently found this nifty snippet on the web - it allows you to bind without having to pass in explicit placeholders:
template <typename ReturnType, typename... Args>
std::function<ReturnType(Args...)>
easy_bind(ReturnType(*MemPtr)(Args...))
{
return [=]( Args... args ) -> ReturnType { return (*MemPtr)( args... ); };
}
This version works great with no args:
auto f1 = easy_bind( (std::string(*)(A&,A&))&Worker::MyFn );
later invoked with:
std::string s = f1( *p_a1, *p_a2 );
Question
Is it possible to modify the code to work with anything up to n args, filling 2-n (in this case) with placeholders? For example, this one should have one placeholder:
auto f2 = easy_bind( (std::string(*)(A&,A&))&Worker::MyFn, *p_a1 );
later invoked with:
std::string s = f2( *p_a2 );
Bonus
Ultimately, it would nice to have something like this (which inserts no placeholders since it will use up the last one), but I don't think it's workable with this implementation (can't pattern-match the signature, I think):
auto f3 = easy_bind( f2, *p_a2 );
later invoked with:
std::string s = f3();
The bottom line is, it would be nice to have a version of bind where I don't need to put in placeholders - it would be quite useful in generic TMP code.
See Question&Answers more detail:os