【问题标题】:Why boost python calls the copy constructor?为什么 boost python 调用复制构造函数?
【发布时间】:2016-08-04 02:05:07
【问题描述】:

假设提供了一个包装类

class Example
{
public:
    Example()
    {
        std::cout << "hello\n";
    }
    Example(const Example& e)
    {
        std::cout << "copy\n";
        counter++;
    }
    ~Example()
    {
        std::cout << "bye\n";
    }
    Example& count()
    {
        std::cout << "Count: " << counter << std::endl;
        return *this;
    }
    static int counter;
};
int Example::counter = 0;

暴露给 python 使用

using namespace boost::python;
class_<Example>("Example", init<>())
        .def("count", &Example::count, return_value_policy<copy_non_const_reference>());

现在如果我执行以下 python 代码

obj=Example()
obj.count().count()

我明白了

hello
Count: 0
copy
Count: 1
copy
bye

这意味着 boost python 正在使用复制构造函数。

我的问题:

  1. 为什么要调用复制构造函数?
  2. 如果我使用 boost::noncopyable,则不会调用复制构造函数。但是,在这种情况下,我无法执行我的 python 代码,因为它抱怨 to_python 转换器(见下文)。有没有办法解决这个问题?

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

【问题讨论】:

    标签: python boost boost-python


    【解决方案1】:

    复制构造函数被调用是因为return_value_policy&lt;copy_non_const_reference&gt;() 正在被设置并且由boost docs 设置:

    copy_non_const_reference 是 ResultConverterGenerator 的模型,它 可用于包装返回非 const 引用的 C++ 函数 类型,以便将引用的值复制到新的 Python 中 对象。

    它抱怨是因为需要复制返回值,但同时类是noncopyable,所以找不到默认转换器。

    要解决此问题,请不要使用 return_value_policy&lt;copy_non_const_reference&gt;() 或定义您的自定义 to_python 转换器。

    【讨论】:

    • 谢谢。显然,我应该改用 boost::python::return_self()。
    猜你喜欢
    • 1970-01-01
    • 2021-05-14
    • 2021-02-18
    • 2014-01-14
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    • 2011-04-18
    相关资源
    最近更新 更多