gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 17:59:39 26 4
gpt4 key购买 nike

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

我正在使用模板编写一个自动 lua 函数绑定(bind)系统,使用部分特化提取函数类型:

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;

关于c++ - 在 C++ 中使用模板元编程从函数类型中提取调用约定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14059127/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com