![](/img/trans.png)
[英]Extracting C Function's Parameters Using C++ Metaprogramming (Example from “Practical C++ Metaprogramming”)
[英]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(全局和成员函数)乘以最大参数数乘以调用约定数。
所以我想知道是否有任何方法可以将调用约定作为模板参数(可能不是,因为它不是真正的类型)来减少复制粘贴的数量。
当您处理这种类型的参数时,您可以执行以下操作之一。
添加一个额外的参数
您的模板将如下所示:
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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.