为什么 boost python 调用拷贝构造函数?
Why boost python calls the copy constructor?
假设提供了包装器 class
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 正在使用复制构造函数。
我的问题:
- 为什么要调用拷贝构造函数?
如果我使用boost::noncopyable,则不会调用复制构造函数。但是,在这种情况下,我无法执行我的 python 代码,因为它抱怨 to_python 转换器(见下文)。有办法解决这个问题吗?
TypeError:未找到 C++ 类型的 to_python(按值)转换器:class 示例
复制构造函数被调用,因为 return_value_policy<copy_non_const_reference>()
被设置并且 boost docs:
copy_non_const_reference is a model of ResultConverterGenerator which
can be used to wrap C++ functions returning a reference-to-non-const
type such that the referenced value is copied into a new Python
object.
它抱怨是因为需要复制 return 值,但同时 class 是 noncopyable
,所以找不到默认转换器。
要解决此问题,请不要使用 return_value_policy<copy_non_const_reference>()
或定义您的自定义 to_python
转换器。
假设提供了包装器 class
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;
使用
暴露给pythonusing 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 正在使用复制构造函数。
我的问题:
- 为什么要调用拷贝构造函数?
如果我使用boost::noncopyable,则不会调用复制构造函数。但是,在这种情况下,我无法执行我的 python 代码,因为它抱怨 to_python 转换器(见下文)。有办法解决这个问题吗?
TypeError:未找到 C++ 类型的 to_python(按值)转换器:class 示例
复制构造函数被调用,因为 return_value_policy<copy_non_const_reference>()
被设置并且 boost docs:
copy_non_const_reference is a model of ResultConverterGenerator which can be used to wrap C++ functions returning a reference-to-non-const type such that the referenced value is copied into a new Python object.
它抱怨是因为需要复制 return 值,但同时 class 是 noncopyable
,所以找不到默认转换器。
要解决此问题,请不要使用 return_value_policy<copy_non_const_reference>()
或定义您的自定义 to_python
转换器。