基于方法参数的 Cppyy 排除?
Cppyy exclusion based on method arguments?
是否可以根据函数参数排除 CPPYY 中的 class 个方法?
例如,假设一个class有两个构造函数:
class A
{
A(int);
A(double);
};
是否可以 select class A 但排除两个构造函数之一?
选择和排除 classes/methods 是使用 genreflex 实用程序完成的,该实用程序使用 XML 文件来配置 CPPYY。但不清楚 XML 文件是否支持这种级别的规范。
为了完整起见也张贴在这里:
不,不存在这样的功能。 (这是 lcgdict 规范的一部分,用于全面排除方法,但我认为这甚至没有实现。)
如果你想将 ctors 减少到 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__
选择的子集进行简单循环)。
或者,您可以使用交叉继承来实现同样的目的。
是否可以根据函数参数排除 CPPYY 中的 class 个方法?
例如,假设一个class有两个构造函数:
class A
{
A(int);
A(double);
};
是否可以 select class A 但排除两个构造函数之一?
选择和排除 classes/methods 是使用 genreflex 实用程序完成的,该实用程序使用 XML 文件来配置 CPPYY。但不清楚 XML 文件是否支持这种级别的规范。
为了完整起见也张贴在这里:
不,不存在这样的功能。 (这是 lcgdict 规范的一部分,用于全面排除方法,但我认为这甚至没有实现。)
如果你想将 ctors 减少到 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__
选择的子集进行简单循环)。
或者,您可以使用交叉继承来实现同样的目的。