专门用于"direct"函数类型(与函数指针类型相对)
specializing for "direct" function types (as opposed to function-pointer types)
函数类型和函数指针类型之间存在差异(出于历史原因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 ...)
(和&&
(来匹配函数引用类型。
而且typedef
不适用于模板。
Q2(相关,可能会解决Q1(:是否有语法允许模板非指针函数类型的别名声明,类似于:
template <typename R, typename ... P>
using TFunction = R (*)(P ...);
Q3(相关,可以解决Q1(:是否可以将函数指针类型转换为函数类型(反之亦然(,而无需检测返回和参数并重建所述类型?
Q2:
template <typename R, typename ... P>
using TFunction = R(P ...);
问1:
使用 Q2 中的语法:
template <typename R, typename ... P>
struct SFunctionInfo<R(P...)>
{};
问3:
除了常规指针引用/取消引用之外,无需执行任何不同操作。(我只是搞砸了测试它(。
- 函数类型 -> 函数指针类型:只需添加 *
- 函数指针类型 -> 函数类型:为 T* 专门化一个结构(或者只使用 std::remove_pointer,正如 PasserBy 上面所说(
相关文章:
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 将C++子类成员函数(虚拟实现)传递给 C 类型函数指针
- C++ 这里有一个返回 (24) 的布尔返回类型函数
- 使用SFINAE来检测void返回类型函数的存在
- 使用此类型函数有什么优势
- 为什么此函数通过类型函数指针调用后,呼叫明智地行为
- 如何使用无类型函数指针调用C++成员函数
- 模板返回类型函数如何在C++中工作
- 具有通用类型函数的动态库[C ]
- 如何在返回类型函数模板的专用化中使用派生类型?( "couldn't infer template argument" )
- Bon appetit :从 int 返回类型函数在 main() 中打印字符串
- 对于需要其他模板参数的类型函数的部分模板专业化
- c++错误的参数类型-函数指针
- 延迟评估模板类型函数
- 在引用或指针返回类型函数上输入
- 具有指针数据类型的非类型函数模板参数
- STL中使用的C++自定义比较类型(函数谓词与较少结构)
- C++模板基类的非类型函数模板的 using 声明
- 字符串到类型函数,模板专用化使调用统一
- 自由类型函数可以接受 Unicode 文件名吗?