专用于“直接”功能类型(与功能指针类型相对)

时间:2018-08-23 23:27:24

标签: c++ templates syntax function-pointers

函数类型和函数 pointer 类型之间存在差异(由于历史原因AFAIK),在某些情况下前者会自动转换为后者。

typedef void (TFoo)(); // a function type
typedef void (*TBar)(); // a function POINTER type

可以使用模板来推断函数指针的返回类型和参数类型。例如:

template <typename T>
struct SFunctionInfo;

template <typename R, typename ... P>
struct SFunctionInfo<R (*)(P ...)>
  {
    using TReturn = R;

    // You could also store the params in a custom type like:
    // using TParams = SSomeVariadicTemplateStruct<P ...>;
  };

template <typename T>
using TFunctionReturn = typename SFunctionInfo<T>::TReturn;

// ...

using TBarReturn = TFunctionReturn<TBar>;

Q1:非指针函数类型是否可能相同?我不知道语法。尝试:

template <typename T>
struct SFunctionInfo;

template <typename R, typename ... P>
struct SFunctionInfo<R ()(P ...)>
  { /* ... */ };

失败(通过g ++):

error: ‘type name’ declared as function returning a function

尽管您可以使用R (&)(P ...)(和&&)来匹配功能 reference 类型。

typedef不适用于模板。


Q2(相关问题,可能会解决Q1):是否存在允许模板非指针函数类型的别名声明的语法,类似于:

template <typename R, typename ... P>
using TFunction = R (*)(P ...);

第3季度(相关的问题,可能会解决第1季度的问题):是否可以将函数指针类型转换为函数类型(反之亦然),而无需借助检测return和参数并重构所述类型?

1 个答案:

答案 0 :(得分:1)

第二季度

template <typename R, typename ... P>
using TFunction = R(P ...);

第一季度

使用第二季度的语法:

template <typename R, typename ... P>
struct SFunctionInfo<R(P...)>
  {};

第三季度

除了常规的指针引用/解引用之外,无需执行其他任何操作。 (我只是搞砸了测试)。

  • 功能类型->功能指针类型:只需添加*
  • function-pointer-type-> function-type:专门用于T *的结构(或仅使用std :: remove_pointer,如PasserBy所述)