using ReturnTypeOfFoo = decltype(std::function{foo})::result_type;
我们可以把它说得更一般一点
template<typename Callable>
using return_type_of_t =
typename decltype(std::function{std::declval<Callable>()})::result_type;
这样你就可以像
int foo(int a, int b, int c, int d) {
return 1;
}
auto bar = [](){ return 1; };
struct baz_
{
double operator()(){ return 0; }
} baz;
using ReturnTypeOfFoo = return_type_of_t<decltype(foo)>;
using ReturnTypeOfBar = return_type_of_t<decltype(bar)>;
using ReturnTypeOfBaz = return_type_of_t<decltype(baz)>;
3条答案
按热度按时间pftdvrlh1#
你可以在这里使用
std::function
,它会给予你一个函数返回类型的别名。这需要C++17的支持,因为它依赖于class template argument deduction,但是它可以用于任何可调用类型:我们可以把它说得更一般一点
这样你就可以像
此技术仅在函数未重载或函数未定义多个
operator()
时有效。oogrdqng2#
最简洁的大概是:
注意,这对函数对象或指向成员函数的指针不起作用,只对没有重载的函数或模板或
noexcept
起作用。但是,如果需要的话,可以通过添加更多的
return_type_of
重载将其扩展为支持所有这些情况。6qftjkof3#
我不知道是否是最简单的方法(如果你能用C++17肯定不是:参见NathanOliver的答案)但是......那么声明一个函数如下:
使用
decltype()
?请注意,
getRetType()
仅被声明而未被定义,因为只调用decltype()
,因此只有返回的类型是相关的。