C++ 使用不推荐使用的活页夹和C++;0x lambdas

C++ 使用不推荐使用的活页夹和C++;0x lambdas,c++,lambda,c++11,bind,traits,C++,Lambda,C++11,Bind,Traits,C++0x不赞成使用旧的绑定,例如bind1st和bind2nd,而赞成使用genericstd::bind。C++0x lambda与std::bind很好地绑定,但它们不与经典的bind1st和bind2nd绑定,因为默认情况下lambda没有嵌套的typedef,例如参数类型,第一个参数类型,第二个参数类型,以及结果类型。 因此我认为std::function可以作为将lambda绑定到旧绑定器的标准方法,因为它公开了必要的typedef 但是,在此上下文中很难使用std::functio

C++0x不赞成使用旧的绑定,例如
bind1st
bind2nd
,而赞成使用generic
std::bind
。C++0x lambda与
std::bind
很好地绑定,但它们不与经典的bind1st和bind2nd绑定,因为默认情况下lambda没有嵌套的typedef,例如
参数类型
第一个参数类型
第二个参数类型
,以及
结果类型
。 因此我认为
std::function
可以作为将lambda绑定到旧绑定器的标准方法,因为它公开了必要的typedef

但是,在此上下文中很难使用
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::bind1st(std::function([](inti,intj){returni

我无法为
std::function
找到一个方便的对象生成器。像
std::make__功能
这样的东西很好。这样的事情存在吗?如果没有,还有其他更好的方法将lamdas绑定到经典活页夹吗?

从未尝试过这样做,我也没有时间提供完整的答案,但我想可以用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);
}
模板
结构自适应辅助:T
{
名称空间bft=boost::function\u类型;
名称空间bmpl=boost::mpl;
typedef typename bft::result_type::type result_type;
typedef typename bmpl::front::type参数_type;
适应太阳系(T):T(T){}
};
模板
适应太阳
自适应(T)
{
返回适配日(t);
}

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

请注意,对于希望其函数对象类型公开上述typedef的遗留库,将经典绑定器与lambda一起使用可能很有用。所以我不认为香草兰姆达斯可以用于这样的库。这是一个简洁的解决方案。从lambda类型继承对我来说是新的,在g++4.5上可以很好地工作。尽管到今天为止,boost::function_类型(1.42)不支持lambdas作为内置可调用类型,但我可以找到解决方法。将来,当他们支持它时(我希望),这个解决方案可以按原样使用。现在,我使用的答案替代了boost::function_类型的内省功能。使用lambdas的这些函数特性,T和std::一元函数的多重继承是有效的。