如何在C++中比较lambda函数的返回类型?

4

我一直在尝试找出lambda表达式的返回类型,以了解函数是否返回void

我的第一个想法是使用std::invoke_result,但是由于它不适用于std::is_same,因为后者期望两个类型,所以它没有像预期的那样工作。

以下是我尝试过的内容:

auto lamb = [] ( int x ) { cout << x << endl; };
is_same<(invoke_result<decltype(lamb),int>),void>;

错误是:
 trabapply2.cc:32:50: error: template argument 1 is invalid
 is_same<(invoke_result<decltype(lamb),int>),void>;

有任何建议吗?

1
移除表达式周围的括号。这是一个语法错误。您还需要将invoke_result_t用作invoke_result只是类型特征类型。这将起作用:static_assert(std::is_same_v<(std::invoke_result_t<decltype(lamb),int>), void>); - Joseph Thomson
谢谢,那解决了问题,我不太清楚为什么“::”没有正常工作,但你解决了这个问题 ;) - João Maia
1个回答

4
你应该移除invoke_result周围多余的括号,从invoke_result中获取type,从is_same中获取value。例如:
is_same<invoke_result<decltype(lamb), int>::type, void>::value // gives true or false

或者

is_same_v<invoke_result_t<decltype(lamb), int>, void> // since C++17

LIVE


谢谢,第二个解决方案在我从函数内部执行时有效,而第一个则无效,不确定为什么,无论如何还是谢谢 ;) - João Maia
@JoãoMaia 对于依赖名称,例如在模板中,您可能需要添加 typename,如 typename invoke_result<decltype(foo), int>::type - songyuanyao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接