boost::python 可转换字符串的属性

5 投票
1 回答
2273 浏览
提问于 2025-04-15 22:01

我有一个C++类,里面有以下几个方法:

class Bar {
...
    const Foo& getFoo() const;
    void setFoo(const Foo&);
};

这个类叫做 Foo,它可以转换成 std::string(也就是说,它有一个可以隐式调用的构造函数,可以从 std::string 创建对象,还有一个可以把 Foo 转换成 std::string 的操作符)。

我定义了一个Boost.Python的包装类,这个类除了其他功能外,还基于之前的两个函数定义了一个属性:

class_<Bar>("Bar")
    ...
    .add_property(
        "foo",
        make_function(
            &Bar::getFoo,
            return_value_policy<return_by_value>()),
        &Bar::setFoo)
    ...

我还标记了这个类可以和 std::string 进行转换。

implicitly_convertible<std::string, Foo>();
implicitly_convertible<Foo, std::string>();

但是在运行时,我在尝试访问这个属性时,仍然遇到了转换错误:

TypeError: No to_python (by-value) converter found for C++ type: Foo

我该如何实现这种转换,而不需要写太多重复的包装函数?(因为我已经在 Foo 类里有了所有的转换函数,所以不想重复写。)

1 个回答

2

最后我放弃了,做了一个类似于Boost.Python常见问题中的自定义字符串类转换示例的东西,虽然有点啰嗦,但确实能按预期工作。

撰写回答