gpt4 book ai didi

c++ - Cython 和重载的 c++ 构造函数

转载 作者:太空狗 更新时间:2023-10-29 21:48:20 25 4
gpt4 key购买 nike

是否有一种标准化(或普遍接受的方式)来解决在包装 C++ 类时无法在 cython 中重载 __cinit__ 方法的问题?

有可能使__cinit__采用*args和**kwargs来包含参数,并在__cinit__范围内根据某些选择生成C++实例的方式图案。然而,这种方法有并发症:

  • 尝试从参数中识别正确的构造函数在某些情况下可能是危险的,除非参数被命名并作为 kwargs 传递,这对用户来说可能变得很麻烦。
  • 当参数未通过它们在 __cinit__ 参数列表中的类型调用时,它们将作为 Python 对象传递。在我的工作案例中,参数是 C++ 类的 Python 包装器,当它们作为 Python 对象从 *args 或 **kwargs 传递时,试图检索这些实例“thisptr”是一项艰巨的任务。
  • 使用一系列 if...elif...else 情况从参数组合中选择 C++ 构造函数的隐含需求最终变得相当困惑。

所以必须有更好的方法。一种方法可能是使用类方法方法(例如,参见:classmethod to overload __init__ behavior in Python)。尽管如此,据我所知(如果我错了请纠正我),classmethod 意味着调用名称与类名不同的方法,这与仅使用一个类名构造实例的 C++ 方式不太相似。

对此有什么想法吗?

最佳答案

就个人而言,我会使用类方法。

WrapperClass.fromSpambar(spambar)

这不是那种令人费解的恕我直言。如果您无法在 C++ 中重载函数,您也需要回退到这种方法。

如果您可以在初始化时接受一些重量级操作,您可以实现一种方法来通过定义“模式”或类似方式来识别调用构造函数的方式。 IE。 args 和 kwargs 的正则表达式。 ;)

我没有看到从 Python 对象获取 thisptr 的问题。

cdef WrapperClass wrpclsi
if isinstance(instance, WrapperClass):
wrpclsi = instance
else:
raise TypeError('expected instance of WrapperClass.')

cdef WrappedClassFromCpp* thisptr = wrpclsi.thisptr

关于c++ - Cython 和重载的 c++ 构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10936126/

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