函数类型和函数 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和参数并重构所述类型?
答案 0 :(得分:1)
第二季度:
template <typename R, typename ... P>
using TFunction = R(P ...);
第一季度:
使用第二季度的语法:
template <typename R, typename ... P>
struct SFunctionInfo<R(P...)>
{};
第三季度:
除了常规的指针引用/解引用之外,无需执行其他任何操作。 (我只是搞砸了测试)。