C ++ 0x已弃用bind1st
和bind2nd
这样的旧绑定器,而不支持通用std::bind
。 C ++ 0x lambdas与std::bind
很好地绑定,但是它们不与经典的bind1st和bind2nd绑定,因为默认情况下lambdas没有嵌套的typedef,例如argument_type
,first_argument_type
,{{ 1}}和second_argument_type
。
所以我认为result_type
可以作为将lambdas绑定到旧绑定器的标准方法,因为它暴露了必要的typedef。
但是,在此上下文中使用std::function
很难使用,因为它会强制您在实例化时拼出函数类型。
std::function
我找不到auto bound =
std::bind1st(std::function<int (int, int)>([](int i, int j){ return i < j; }), 10); // hard to use
auto bound =
std::bind1st(std::make_function([](int i, int j){ return i < j; }), 10); // nice to have but does not compile.
的方便对象生成器。像std::function
之类的东西会很棒。这样的事情存在吗?如果没有,还有其他更好的方法将lamdas绑定到经典粘合剂吗?
答案 0 :(得分:2)
从未尝试过这样的事情,我没有时间提供完整的答案,但我想可以用Boost.FunctionTypes完成一些事情。
这是一个粗略,不完整且未经测试的草案,可以给你一个想法:
template <typename T>
struct AdaptedAsUnary : T
{
namespace bft = boost::function_types;
namespace bmpl = boost::mpl;
typedef typename bft::result_type<T>::type result_type;
typedef typename bmpl::front<typename bft::parameter_types<T>::type>::type argument_type;
AdaptedAsUnary(T t) : T(t) {}
};
template <typename T>
AdaptedAsUnary<T>
AdaptAsUnary(T t)
{
return AdaptedAsUnary<T>(t);
}
答案 1 :(得分:1)
我不知道你为什么还需要bind1st等。我唯一能想到的是支持旧代码。实际上,bind1st(f, a)
可以替换为[a](v){ return f(a, v); }
等,这是一种通用解决方案。