qua*_*ant 6 c++ lambda c++11 c++14
我想从函数返回一个lambda对象,而不将其转换为函数指针或函数对象.更具体地说,我想让它留给客户端决定是否转换为函数对象或将lambda保留为匿名函数:
template<typename F> // F may be a std::function, boost::function, or lambda object
auto func(F f) -> decltype(???) // what do I put in here?
{
    return [=]()
    {
        return f(someParameter);
    }
}
此代码不起作用,因为我不知道要推断出什么类型.一种选择可能是将lambda的主体复制到decltype调用中.当然有更好的方法!
我想以这种方式这样做的理由是,我希望让编译器能够更智能地内联或展开lambdas.这种推理有意义吗?如果是这样,为什么,何时返回会更好std::function?这个方法在编译时会变慢吗?
在C++ 11中,你无法做到这一点.你可以做一些接近它的事情,但不是这个.
基本上,提取类型的C++ 11 lambda的唯一方法是从类型的实例中推导出它,并且不能在未评估的上下文中命名该类型.因此函数不能返回类型取决于lambda类型的类型.(除非在函数声明之前使用body声明了lambda,在这种情况下没有用).您可以编写一个作为手动功能对象的仿函数,或者使用std::bind为您执行此操作的仿函数.
你可以让它评估一些你也传入lambda的其他函子,但是这很尴尬(特别是在C++ 11中,这些仿函数要么必须键入erase,要么必须是"手动"写成的旧式函子a struct或class).
C++ 1y中添加的功能之一使其变得简单,但是:
template<typename F, typename T>
auto func(F f, T t) {
  return [=]() {
    return f(t);
  };
}
int main() {
  auto f = func( [](int x){ std::cout << x << "\n"; }, 7 );
  f();
  f();
}
您的编译器可能已对此功能提供C++ 1y支持.
| 归档时间: | 
 | 
| 查看次数: | 389 次 | 
| 最近记录: |