pybind11::array_t 是不是有(深)复制构造函数?
Posted
技术标签:
【中文标题】pybind11::array_t 是不是有(深)复制构造函数?【英文标题】:Is there a (deep) copy constructor for pybind11::array_t?pybind11::array_t 是否有(深)复制构造函数? 【发布时间】:2019-06-13 07:22:32 【问题描述】:我有一个现有的pybind11::array_t
,需要进行复制构建。 pybind11
中是否有允许我对 array_t
进行深层复制的函数?
我知道我可以创建一个新的array_t
,调整它的大小,然后将原始数据复制到其中,但我想知道是否已经存在隐藏这些段落的方法。
【问题讨论】:
你确定auto copy = original;
没有做你想做的事吗?
是的,因为这涉及到浅拷贝。这个 sn-p 打印相同的地址:using py_arr = pybind11::array_t<double>; py_arr a; auto b = a; std::cout << b.data() << " " << a.data() << std::endl;
【参考方案1】:
默认的复制构造函数执行深拷贝,people are actually trying to avoid this :)
要使用复制构造函数,可以通过buffer
using py_arr = pybind11::array_t<double>;
py_arr a;
// do stuff with a, fill it and everything...
auto buffer = a.request();
py_arr b = py_arr(buffer);
std::cout << b.data() << " " << a.data() << std::endl; // this won't return the same address twice
【讨论】:
感谢您的评论。 (a) 我同意缓冲选项。但是,request
是一个 const 方法,因此如果您在某处有一个接受const pybind11::array_t & a
的函数,并且想要创建它的深层副本,则需要const_cast
。这就是我要求深拷贝构造函数或类似方法的原因。 (2) py::array_t
的默认复制构造函数执行 shallow 复制。 using py_arr = pybind11::array_t<double>; py_arr a; py_arr b(a); std::cout << b.data() << " " << a.data() << std::endl;
打印相同的地址。
如果没有其他选择,我可以使用缓冲区,但我希望有一种替代的、更紧凑的方式也适用于 const 情况。
哦,我明白了,您可以使用我刚刚给出的实现重载 =
运算符(请参阅 this answer),这应该可以解决您的问题吧?
嗨,很抱歉回复晚了 :) 是的,我可以重载它,但它会破坏语义。有些地方我需要浅拷贝,有些地方我需要深拷贝。我想我将只使用缓冲区,即使我必须const_cast
。感谢您的帮助!以上是关于pybind11::array_t 是不是有(深)复制构造函数?的主要内容,如果未能解决你的问题,请参考以下文章
尝试导入 pybind opencv 模块时出现 libgtk 错误