这个问题从这里开始。然而,前一个问题的措辞如此糟糕(实际上是错误的),以至于有人建议我从头开始再问一次。
我有一个 C 函数指针表。
一些 C 代码(我们称之为 lib-X)有一个基本的构建块(我们称之为 X 对象)。每个 X 对象都可以调用该表上的函数。
这些表函数通常具有不同的签名(请参阅此处的 typedefs ),尽管多个函数可以共享相同的签名。表中大约有 100 个这样的函数。
在 C++ 中,每个 X 对象都有一个关联的 Final:Base 类。
我想将这些调用转发到 X 对象的相应 C++ Final 实例,但我想将它包含在 try/catch 中,因为 C++ 使用者可能会提供一个有问题的 Final。
所以我有一个 C++ 基类,它对表上的每个条目都有一个虚函数。
然后我有一个派生自基类的 C++ Final 类(可能很多;Final1 Final2 Final3 等)。
所以现在我只需要编写一个处理程序
获取第一个“self”参数(始终是指向调用函数的 X 对象的指针)
检索关联的 C++ 基类实例。
在 try catch 块中,调用相应的虚函数,将所有剩余参数转发到,
...这实际上将调用 Final 中的覆盖。
这有点像试图理解《盗梦空间》的情节。lib-X 实际上是 Python 运行时,尽管我试图保持一般性。
问题是这样的函数有几十个,这会导致一些非常混乱且无法维护的 C++ 代码——如果我必须为每个函数手动编写一个蹦床函数,看起来像:
extern "C" PyObject *call_handler( PyObject *self, PyObject *args, PyObject *kw )
{
try
{
PythonExtensionBase *p = getPythonExtensionBase( self );
if( kw != NULL )
return new_reference_to( p->call( Object(args), :Object(kw) ) );
else
return new_reference_to( p->call( Object(args), Object() ) );
}
catch( Py::Exception & )
{
return NULL; // indicate error
}
}
(来源在这里)
我试图想出一个紧凑的设计,允许这种异常安全的蹦床。
我目前的进度是[已删除,请参阅下面的答案]