考虑一个函数,不一定是templatised :
T foo(Y bar);
其中T
和Y
是类型。
我可以使用decltype(bar)
来获取bar
的类型。所以我可以编写像
decltype(bar) anotherBar;
但是我有办法获得返回类型吗? decltype(return)
会有语法意义。
答案 0 :(得分:4)
在C ++ 11中,您可以使用尾随返回类型,例如:
auto foo(Y bar) -> decltype(some_expr(bar)) {
return some_expr(bar);
}
使其成为尾随的必要性仅仅是因为表达式依赖于被声明为参数的bar
,并且在定义返回类型的地方不存在。
C ++ 14提供(或将被批准)一种更简单的方法,其中编译器应推断出函数的类型:
auto foo(Y bar) {
return some_expr(bar);
}
请注意,即使标准允许这样做,声明中没有拼写出类型的事实也会产生一些可能不需要的效果。对于初学者,你不能在没有提供定义的情况下声明该函数(推断返回类型是查看正文,没有正文,声明也没有返回类型)。此外,如果有多个退货声明,这是有问题的[我不记得这里的具体细节]
对于模板函数,在替换模板参数并实例化函数之前无法知道返回表达式的类型,即替换后的,因此推导的返回类型不能用于SFINAE环境。
虽然C ++ 14尚未获得批准,但某些编译器可能已经实现了此功能,请查看编译器的文档。
答案 1 :(得分:3)
只需将函数本身的调用表达式用作decltype
' s arg:
decltype(foo(bar))
答案 2 :(得分:2)
您可以使用std::result_of
。
#include <type_traits>
constexpr void foo();
static_assert(std::is_same<void, decltype(foo())>::value, "");
static_assert(std::is_same<decltype(foo()), std::result_of<decltype(foo)&(/*argtypes*/)>::type>::value, "nope");
int main(){}
我不知道为什么你在模板上下文之外使用decltype
。 not 通常会提高可读性或代码&#34; kung-fu level&#34;。
请注意,回想起来,std::result_of
会增加代码&#34;功夫等级&#34;甚至不仅仅是使用decltype
。这不会使decltype
用于此类事情。