【发布时间】:2014-02-23 03:19:35
【问题描述】:
我正在编写一个模板函数,它以函数对象(现在是 lambda)作为参数,以 lambda 数据类型作为模板参数,并返回与 lambda 返回相同的类型。像这样:
template<typename TFunctor, typename TReturn>
TReturn MyFunc(TFunctor &Func, TReturn) //The second arg is just to keep the template spec happy
{
return Func();
}
消费代码是这样的:
int n = MyFunc([](){return 17;}, int());
我不喜欢指定返回数据类型的丑陋方式。编译器生成的 lambda 类中是否有一些内置的 typedef 可以给我它的返回类型?这样 MyFunc 就可以像这样运行:
template<typename TFunctor>
TFunctor::return_type MyFunc(TFunctor &Func)
{ //...
我希望它返回与 lambda 返回相同的类型,而无需明确说明该类型。
编辑:目前,我所关心的所有 lambda 表达式都是无争议的。变量捕获也能做到这一点。
【问题讨论】:
-
根据
TFunctor的实际情况,它可能有一个重载的operator(),这意味着返回类型可以取决于你给它的参数。 (不过,对于非泛型 lambda,情况并非如此) -
@leemes 对于泛型 lambda,尚未为真。随着向 C++1y 引入多态 lambda,这种情况将会改变。
-
@Nevin 这就是为什么我说“对于 non-generic lambdas 来说不是这样”,这意味着它们的返回类型是固定的/已知的,无需查看参数。使用通用 lambda 会改变这种情况。泛型 lambda can(但不是必须)的返回类型取决于其参数。当您说“多态 lambda”时,您是指 C++14 中的通用 lambda 吗?