我正在尝试使用boost python将带有名称别名的C ++类公开给python。
struct Foo
{
void hi() const { std::cout << "hi" << std::endl; }
};
BOOST_PYTHON_MODULE(Example)
{
typedef Foo Bar;
class_<Foo>("Foo")
.def("hi", &Foo::hi)
;
class_<Bar>("Bar")
.def("hi", &Bar::hi)
;
}
除了令人讨厌的RuntimeWarning之外,代码按预期工作。
RuntimeWarning: to-Python converter for Foo already registered; second conversion method ignore
在python中添加Bar = Foo
也可以。但是我需要将定义保留在同一模块中。有没有更好的方法可以做到这一点?
答案 0 :(得分:2)
由于typedef
仅引入了别名,因此您的代码仅以不同的名称注册了相同的类。
建议:
Foo
和Bar
,那么您将拥有不同的类型,并且警告也将消失。Bar = Foo
等效的C ++,即,将对象简单分配给模块命名空间中的名称。鉴于下面的反馈,支持旧版代码是必需的,这就是我要做的:
// same as above
struct Foo { ... };
// For legacy reasons, it is mandatory that Foo is exported
// under two names. In order to introduce new C++ types, we
// just derive from the original Foo. The approach using a
// typedef doesn't work because it only creates an alias but
// not an existing type.
struct FooType: Foo {};
struct BarType: Foo {};
BOOST_PYTHON_MODULE(Example)
{
class_<FooType>("Foo")
.def("hi", &FooType::hi)
;
class_<BarType>("Bar")
.def("hi", &BarType::hi)
;
}
答案 1 :(得分:2)
我会采用Ulrich提到的“等同于Python Bar = Foo
的C ++”方法。
您可以使用boost::python::scope
来访问当前模块及其属性。
#include <boost/python.hpp>
#include <iostream>
namespace bp = boost::python;
struct Foo
{
void hi() const { std::cout << "hi" << std::endl; }
};
BOOST_PYTHON_MODULE(Example)
{
bp::class_<Foo>("Foo")
.def("hi", &Foo::hi)
;
bp::scope().attr("Bar") = bp::scope().attr("Foo");
}