c++ 推导函数指针返回类型

velaa5lx  于 2023-01-03  发布在  其他
关注(0)|答案(2)|浏览(177)

我认为代码会更好地说明我的需求:

template <typename F>
struct return_type
{
  typedef ??? type;
};

因此:

return_type<int(*)()>::type -> int
return_type<void(*)(int,int)>::type -> void

我知道decltyperesult_of,但是它们需要传递参数。我想从一个模板参数推导出函数指针的返回类型。我不能将返回类型作为参数添加,因为这正是我想在这里隐藏的......
我知道boost中有一个解决方案,但我不能使用它,试图从boost中挖掘它导致了一个惊人的失败(这是经常发生的)。
欢迎使用C++11解决方案(只要VS2012支持)。

8wigbo56

8wigbo561#

如果您可以使用变量模板(11月12日CTP),则应该可以:

template <class F>
struct return_type;

template <class R, class... A>
struct return_type<R (*)(A...)>
{
  typedef R type;
};

Live example.
如果不能使用可变参数模板,则必须为0、1、2 ...参数提供特定的专门化(手动或预处理器生成)。

    • 编辑**

正如在注解中指出的,如果你还想使用可变参数函数,你必须添加一个额外的局部特化(或者在非可变参数模板的情况下,为每个参数计数添加一个):

template <class R, class... A>
struct return_type<R (*)(A..., ...)>
{
  typedef R type;
};
jfgube3f

jfgube3f2#

问这个问题已经有一段时间了,对于C++17来说,有一个有趣的选项,不过语法和最初问的有点不同,但结果(一个类型)是一样的。
首先,我们需要一个helper函数。正如你在这里看到的,这个函数接受一个函数指针并返回一个类型为R的对象。我们只需要decltype语句,因此这个函数永远不会被调用,所以一个forward声明就足够了。

template<typename R, typename... ARGS>
static R return_type(R (*)(ARGS...));  // forward declaration only for decltype

诀窍是将函数指针作为模板auto参数提供,该参数被转发到decltype语句:

template<auto FUNCTION_POINTER>
using ReturnType = decltype(return_type(FUNCTION_POINTER));

现在很容易得到返回类型:

#include <iostream>
#include <type_traits>

template<typename R, typename... ARGS>
static R return_type(R (*)(ARGS...));  // forward declaration only for decltype

template<auto FUNCTION_POINTER>
using ReturnType = decltype(return_type(FUNCTION_POINTER));

int func1(char c, int i, long l);  // also here only forward declarations needed
void func2(unsigned u, float f);
double func3(bool b);

int main()
{
    std::cout << std::is_same_v<int, ReturnType<func1>> << std::endl;
    std::cout << std::is_same_v<void, ReturnType<func2>> << std::endl;
    std::cout << std::is_same_v<double, ReturnType<func3>> << std::endl;
    std::cout << std::is_same_v<void, ReturnType<func1>> << std::endl;
}

您可以在Wandbox中尝试完整的示例:https://wandbox.org/permlink/5akL0MQDoDuJlQNY

相关问题