在c++中使用模板元编程从函数类型中提取调用约定

Extracting calling convention from a function type using template metaprogramming in c++

本文关键字:函数 类型 调用 约定 编程 提取 c++      更新时间:2023-10-16

这是一个相当长的机会,因为我不确定这是可能的,但也许有人比我更有经验的模板元编程会启发我。

我正在编写一个使用模板的自动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;