【发布时间】:2013-02-08 01:45:45
【问题描述】:
我最近在网上发现了这个漂亮的 sn-p - 它允许您绑定而无需传递显式占位符:
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(在这种情况下)?例如,这个应该有一个占位符:
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();
底线是,如果有一个不需要放置占位符的 bind 版本会很好 - 它在通用 TMP 代码中非常有用。
【问题讨论】:
-
为什么不只是
return { MemPtr };? -
@KerrekSB 在没有传入任何内容的情况下工作 - 如果我开始传入 partial 参数列表怎么办?
-
虽然没有 显式 占位符,但它们在演员表中存在(我个人觉得阅读起来不如占位符列表好)。
-
我不知道如何看待
(std::string(*)(A&,A&))&Worker::MyFn。这合法吗? -
@KerrekSB 在我的测试用例中需要它(解决重载问题 - 我知道,它看起来像一团糟!) - 这部分测试结果很好。
标签: c++ templates c++11 variadic-templates