我可以在没有实际调用的情况下推断出lambda的返回类型吗?

时间:2014-05-26 15:41:33

标签: c++11 lambda type-deduction

对某些人来说这似乎是显而易见的,但我仍然想知道:有没有办法让编译器推断出lambda返回类型而不实际调用它?

当然你可以auto retval = myLambda();,但我想要......:/ / p>

T_MY_LAMBDA_RETVAL retval;
...
retval = myLambda();

我为什么要这样?简单:

try {
    auto retval = myLambda();
catch (exception e) {
    ...
}

// retval is undefined but I wonna have it!!! :)

3 个答案:

答案 0 :(得分:3)

typedef typename std::result_of<decltype(lambda)()>::type return_type;

推导出使用0参数调用lambda的返回类型。

一如既往:

typedef decltype( lambda() ) return_type;

小心可能的左值参考。

答案 1 :(得分:3)

完成Yakk的回答

使用:

auto myLambda = [&](int) { return 42; }; // Or any lambda

你可以使用

using T_MY_LAMBDA_RETVAL = std::result_of<decltype(myLambda)(int)>::type;

using T_MY_LAMBDA_RETVAL = decltype(myLambda(std::declval<int>()));

然后使用它:

T_MY_LAMBDA_RETVAL retval;
try {
    retval = myLambda(42);
catch (exception& e) {
    // ...
}
// you may use retval which may be uninitialized.

答案 2 :(得分:0)

lambda表达式创建一个重载operator()的唯一函子类型,这是调用lambda时调用的函数。我们可以利用这个事实来找出lambda表达式的返回类型。

template<typename T>
struct lambda_traits_helper;  // undefined

// specialize for pointer to member function
template<typename T, typename Result, typename... Args>
struct lambda_traits_helper<Result(T::*)(Args...) const>
{
    using result_type = Result;
};

template<typename Func>
struct lambda_traits 
    : lambda_traits_helper<decltype(&Func::operator())>
    // instantiate helper trait with pointer to operator()
{};

使用示例:

auto lambda = []{ return 42; };
assert((std::is_same<int, lambda_traits<decltype(lambda)>::result_type>::value));

auto lambda = [](int a){ return std::to_string(a); };
assert((std::is_same<std::string, lambda_traits<decltype(lambda)>::result_type>::value));

Live demo