gpt4 book ai didi

c++ - 使用模板将静态代码编码为实例方法蹦床函数

转载 作者:行者123 更新时间:2023-11-28 02:37:50 24 4
gpt4 key购买 nike

我正在尝试重新编写一些相当丑陋的模板代码。

供引用,原文在这里:https://codereview.stackexchange.com/questions/69545/recode-c-c-trampoline-function-macros-using-templates

class Final : Base
{
void Foo(){...}
void Bar(){...}

static void init(){
// register_method populates a table of "extern C" function pointers.
register_method( "foo", & FooHandler );
register_method( "bar", & BarHandler );
}
:
// trampolines
static void FooHandler( void* pInstance ) {
Final* f = reinterpret_cast<Final*>(pInstance);
f->Foo();
}
static void BarHandler( void* pInstance ) {
Final* f = reinterpret_cast<Final*>(pInstance);
f->Bar();
}
}

我的代码与 CPython(C 库)接口(interface)。Python 运行时看到“myInst.foo”,在表中查找“foo”并调用:

Final::FooHandler( pointer_to_myInst );

(注意可以将静态方法类型转换为 C 函数指针)

FooHandler 跳到正确的 Final 实例的 Foo 方法。

实际上,句柄并不是那么干净,有很多方法,每个方法都需要一个相同的处理程序(但具有不同的函数地址)。

我试图将处理程序机制抽象为一个基类,如下所示:

class Final : Base<Final>
{
void Foo(){...}
void Bar(){...}

static void init(){
// register_method populates a table of "extern C" function pointers.
register_method( "foo", & Foo, Handler< &Foo> );
register_method( "bar", & Bar, Handler< &Bar> );
}
:
}

class Base<Final>
{
typedef void (Final::*FuncSig)(void);
typedef void (Final::*HandlerSig)(void*); // takes 1 pvoid param

void register_method( std::string name, FuncSig meth, HandlerSig handler ) {
...
}

// generic trampoline
template< Sig sig>
static void Handler( void* pInstance ) {
Final* f = reinterpret_cast<Final*>(pInstance);
f ->* sig();
}
}

我目前陷入了编译器错误 ( http://ideone.com/vOtbcD ),所以我什至不确定该技术是否有效。

有什么方法可以做到这一点,还是这只是您真正需要宏的时候之一?

供引用,原文在这里:https://codereview.stackexchange.com/questions/69545/recode-c-c-trampoline-function-macros-using-templates

可以看出,原版使用了相当难看的宏。

最佳答案

register_method 如果您要从静态 init 函数调用它,则它需要是静态的。

通过成员函数指针调用成员函数需要额外的一组括号:(f->*sig)();

有了这些,您的测试用例就可以在 C++11 模式下编译。也就是说,您是否考虑过使用 std::functionstd::bind 来执行此操作?在不知道 register_method 的作用的情况下很难说出它实际是什么样子,但最终可能会更清晰一些。

关于c++ - 使用模板将静态代码编码为实例方法蹦床函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26934036/

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