10

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

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 支持)。

4

1 回答 1

12

如果您可以使用可变参数模板(12 年 12 月 CTP),这应该可以:

template <class F>
struct return_type;

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

活生生的例子

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

编辑

正如评论中所指出的,如果您还想使用可变参数函数,则必须添加一个额外的部分特化(或者在 no-variadic-templates 情况下为每个参数计数添加一个):

template <class R, class... A>
struct return_type<R (*)(A..., ...)>
{
  typedef R type;
};
于 2013-09-09T09:55:13.660 回答