我正在尝试重新编码一些相当难看的模板编码。
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 库)接口。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),所以我什至不确定该技术是否有效。
有什么方法可以做到这一点,或者这只是你真正需要宏的时候之一?
可以看出,原始版本使用了相当丑陋的宏。