3

C++0x 已弃用旧的绑定器,例如bind1stbind2nd支持通用std::bind. C++0x lambda 可以很好地绑定,std::bind但它们不能与经典的 bind1st 和 bind2nd 绑定,因为默认情况下 lambda 没有嵌套的 typedef,例如argument_typefirst_argument_typesecond_argument_typeresult_type. 所以我认为std::function可以作为将 lambdas 绑定到旧绑定器的标准方法,因为它公开了必要的 typedef。

但是,std::function在这种情况下很难使用 using,因为它会强制您在实例化函数类型时拼写出函数类型。

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。像这样的东西std::make_fuction会很高兴。这样的事情存在吗?如果没有,还有其他更好的方法将 lamdas 绑定到经典活页夹吗?

4

2 回答 2

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);
}
于 2010-04-07T20:20:45.250 回答
1

我不知道你为什么还需要 bind1st 等。我唯一能想到的就是支持旧代码。实际上,bind1st(f, a)可以用[a](v){ return f(a, v); }etc代替,这是一个通用的解决方案。

于 2011-06-25T03:59:19.123 回答