首页 > 解决方案 > 基于方法参数的 Cppy 排除?

问题描述

可以根据函数参数在 CPPYY 中排除类方法吗?

例如,假设一个类有两个构造函数:

class A
{
 A(int);
 A(double);
};

是否可以选择 A 类但排除两个构造函数之一?

选择和排除类/方法是使用genreflex 实用程序完成的,该实用程序使用XML 文件来配置CPPYY。但不清楚 XML 文件是否支持这一级别的规范。

标签: cppyy

解决方案


为了完整起见,也在这里发布:

不,不存在这样的功能。(排除方法批发是 lcgdict 规范的一部分,但我认为这甚至没有实现。)

如果您想将 ctor 减少到 1,这在 Python 中既快速又简单。例子:

import cppyy

cppyy.cppdef("""
class A
{
public:
 A(int) { std::cerr << "int called" << std::endl; }
 A(double) { std::cerr << "double called" << std::endl; }
};
""")

def pythonize_A(klass, name):
    if name == 'A':
        klass.__init__ = klass.__init__.__overload__("int")

cppyy.py.add_pythonization(pythonize_A)

from cppyy.gbl import A

a = A(1)
b = A(1.) # <- fails with TypeError

原则上,您甚至可以编写一个自定义__init__,对您想要保留的构造函数进行重载(例如,对使用选择的子集进行简单循环__overload__)。

或者,您可以使用交叉继承来实现相同的目的。


推荐阅读