提振.Python对类似的构造函数感到困惑
boost.python confused about similar constructor
我有一个类,看起来像
class Foo{
Foo();
Foo(int i);
Foo(bool b);
Foo(double d);
};
,我像往常一样将类暴露给python
class_<Foo>("Foo")
.def(init<int>())
.def(init<bool>())
.def(init<double>());
当我尝试在python中使用to时,python代码总是将c'tor参数转换为double(它总是类def export中的最后一个)。有没有一种方法可以显式地告诉boost。Python如何显式处理由类型?
你可以改变构造函数定义的顺序,最后一个定义的优先级更高。以下是我的结果:
class_<Foo>("Foo")
.def(init<bool>())
.def(init<double>())
.def(init<int>());
Foo() # calls Foo()
Foo(True) # calls Foo(int)
Foo(1) # calls Foo(int)
Foo(4.2) # calls Foo(double)
如你所见,这不是一个完美的解决方案。所以,如果你真的需要重载的构造函数,我建议你使用自己的工厂函数。
using namespace boost::python;
static boost::shared_ptr<Foo>
makeFoo(const object& data)
{
boost::shared_ptr<Foo> obj;
if (PyBool_Check(data.ptr())) {
bool val = extract<bool>(data);
obj.reset(new Foo(val));
}
else if (PyFloat_Check(data.ptr())) {
double val = extract<double>(data);
obj.reset(new Foo(val));
}
else {
int val = extract<int>(data);
obj.reset(new Foo(val));
}
return obj;
}
class_<Foo>("Foo")
.def("__init__", make_constructor(makeFoo));
使用makeFoo:
Foo() # calls Foo()
Foo(True) # calls Foo(bool)
Foo(1) # calls Foo(int)
Foo(4.2) # calls Foo(double)
顺便说一下,python.org上的文档会有所帮助。
相关文章:
- "error: no matching function for call to"构造函数错误
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- Boost Python - 用参数包装构造函数
- Python 错误:在 SWIG 生成的C++模板化代码模块中没有定义构造函数
- 带有 Boost.Python 的私有构造函数
- Boost.Python - 参数化构造函数的错误
- SWIG - 如何使用采用'const double*'的构造函数将类包装为 python
- Python __init__与C++构造函数的比较
- 将构造函数添加到boost.python子类导致参数不匹配错误
- 带有可选参数的 Boost.Python 构造函数
- boost-python:如何提供自定义构造函数包装器函数
- 如何在SWIG包装C++代码中向目标语言(特别是Python)添加替代构造函数
- 从c++的角度看,Python中的重载构造函数
- 提振.Python对类似的构造函数感到困惑
- 创建Python构造函数,参数来自c++, PyObject
- c++ python构造函数类型错误(可能的命名空间问题)
- 使用Boost Python公开带有带有数组参数的构造函数的类
- 什么是c++ const-reference复制构造函数参数的python等价物?