使用弃用的绑定器和C ++ 0x lambda

时间:2010-04-07 16:24:02

标签: c++ lambda c++11 bind traits

C ++ 0x已弃用bind1stbind2nd这样的旧绑定器,而不支持通用std::bind。 C ++ 0x lambdas与std::bind很好地绑定,但是它们不与经典的bind1st和bind2nd绑定,因为默认情况下lambdas没有嵌套的typedef,例如argument_typefirst_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绑定到经典粘合剂吗?

2 个答案:

答案 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); }等,这是一种通用解决方案。