在c++中使用模板元编程从函数类型中提取调用约定
Extracting calling convention from a function type using template metaprogramming in c++
这是一个相当长的机会,因为我不确定这是可能的,但也许有人比我更有经验的模板元编程会启发我。
我正在编写一个使用模板的自动lua函数绑定系统,使用部分专门化提取函数类型:
template<typename T, T FUNCTION> class Function_c;
template<typename R, R (*FUNCTION)()> class Function_c<R (*)(), FUNCTION>; //specialized version
问题是,这并没有告诉我函数调用约定,所以(在VS2012 32位)它不会为__stdcall编译,并且它会在__fastcall中崩溃。我可以创建另一个专门的版本来处理特定的调用约定,例如:
template<typename R, R (__stdcall *FUNCTION)()> class Function_c<R (__stdcall *)(), FUNCTION>;
但是排列的数量开始失去控制:2 (global &成员函数)乘以最大参数数乘以调用约定数。
所以我想知道是否有任何方法可以将调用约定作为模板参数(可能不会,因为它不是真正的类型)来减少复制粘贴的数量。
处理这种类型的参数时,您可以执行以下操作之一:
添加一个额外参数
你的模板看起来像这样: template < typename T, T function, typename CallType > class Function_c;
您可以很容易地将实际调度隐藏在CallType
中,因此您只需要为每种类型的调用实现一个类。
创建一个包装器
我猜你的类已经是一个包装器对象,但你可以很容易地更进一步。
您可以为每个调用类型创建包装器,然后可以将模板更改为:
template < typename T, typename Functor > class Function_c;
这样实例化:Function_c<int, WrapperStdCall<int (*)()> > x;
相关文章:
- 为什么在我的函数类型后使用引用运算符 (&) 允许我修改它返回的值?
- 来自 DLL 的函数调用 [表观调用的括号前面的表达式必须具有(指向-)函数类型]
- 是否有任何建议来统一函数类型限定符并简化可恶的函数类型?
- 关于 C++ 中的函数类型定义
- 用于检测函数类型是否为否的特征
- 函数类型参数的模板参数推导
- 标准对此指向成员函数类型模板参数有何说明?是我的代码有误,还是 MSVS 16.6 有问题?
- C++无效的函数类型转换
- STL 函数和函数类型与函数指针类型
- 如何将result_of与函数类型定义一起使用
- 将模板(没有规范)传递给 std::thread() 会出现错误:<未解析的重载函数类型>匹配错误
- C++ 编译错误:gnu_printf是无法识别的格式函数类型
- 专门用于"direct"函数类型(与函数指针类型相对)
- 将函数类型作为模板参数传递不会编译
- 通过参数传递 lambda(无函数类型模板)
- 如何在模板参数中分离函数类型返回类型和参数
- 为什么比较函数类型需要指定为模板参数?
- 带有限定符的函数类型定义用例
- 如何声明对函数类型的常量引用
- 非类型模板参数允许各种函数类型?