我认为代码会更好地说明我的需求:
template <typename F>
struct return_type
{
typedef ??? type;
};
因此:
return_type<int(*)()>::type -> int
return_type<void(*)(int,int)>::type -> void
我知道decltype
和result_of
,但是它们需要传递参数。我想从一个模板参数推导出函数指针的返回类型。我不能将返回类型作为参数添加,因为这正是我想在这里隐藏的......
我知道boost中有一个解决方案,但我不能使用它,试图从boost中挖掘它导致了一个惊人的失败(这是经常发生的)。
欢迎使用C++11解决方案(只要VS2012支持)。
2条答案
按热度按时间8wigbo561#
如果您可以使用变量模板(11月12日CTP),则应该可以:
Live example.
如果不能使用可变参数模板,则必须为0、1、2 ...参数提供特定的专门化(手动或预处理器生成)。
正如在注解中指出的,如果你还想使用可变参数函数,你必须添加一个额外的局部特化(或者在非可变参数模板的情况下,为每个参数计数添加一个):
jfgube3f2#
问这个问题已经有一段时间了,对于C++17来说,有一个有趣的选项,不过语法和最初问的有点不同,但结果(一个类型)是一样的。
首先,我们需要一个helper函数。正如你在这里看到的,这个函数接受一个函数指针并返回一个类型为R的对象。我们只需要decltype语句,因此这个函数永远不会被调用,所以一个forward声明就足够了。
诀窍是将函数指针作为模板auto参数提供,该参数被转发到decltype语句:
现在很容易得到返回类型:
您可以在Wandbox中尝试完整的示例:https://wandbox.org/permlink/5akL0MQDoDuJlQNY