对某些人来说这似乎是显而易见的,但我仍然想知道:有没有办法让编译器推断出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!!! :)
答案 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));