c++ 确定函数返回类型的最简单方法

enyaitl3  于 2023-03-14  发布在  其他
关注(0)|答案(3)|浏览(199)

给定一个非常简单但很长的函数,例如:

int foo(int a, int b, int c, int d) {
    return 1;
}

// using ReturnTypeOfFoo = ???

确定函数的返回类型(ReturnTypeOfFoo,在本例中:int),* 而不重复函数的参数类型 *(仅通过名称,因为已知函数没有任何其他重载)?

pftdvrlh

pftdvrlh1#

你可以在这里使用std::function,它会给予你一个函数返回类型的别名。这需要C++17的支持,因为它依赖于class template argument deduction,但是它可以用于任何可调用类型:

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)>;

此技术仅在函数未重载或函数未定义多个operator()时有效。

oogrdqng

oogrdqng2#

最简洁的大概是:

template <typename R, typename... Args>
R return_type_of(R(*)(Args...));

using ReturnTypeOfFoo = decltype(return_type_of(foo));

注意,这对函数对象或指向成员函数的指针不起作用,只对没有重载的函数或模板或noexcept起作用。
但是,如果需要的话,可以通过添加更多的return_type_of重载将其扩展为支持所有这些情况。

6qftjkof

6qftjkof3#

我不知道是否是最简单的方法(如果你能用C++17肯定不是:参见NathanOliver的答案)但是......那么声明一个函数如下:

template <typename R, typename ... Args>
R getRetType (R(*)(Args...));

使用decltype()

using ReturnTypeOfFoo = decltype( getRetType(&foo) );

请注意,getRetType()仅被声明而未被定义,因为只调用decltype(),因此只有返回的类型是相关的。

相关问题