Pybind11 - 返回指向 unique_ptr 容器的指针
Pybind11 - Returning a pointer to a container of unique_ptr
我一直在使用优秀的 pybind11 库,但遇到了障碍。
我需要 return 到 Python 一个指向不可复制对象的指针(因为该对象包含 unique_ptrs)。
一般来说,这在使用 return_value_policy::reference 的警告下工作正常。
但是,return 将指针指向具有不可复制向量的对象会导致编译错误。
在这种情况下,pybind 似乎想要执行复制,即使 return 值策略是引用并且函数明确地 return 是一个指针。
为什么会这样,是否有解决方法?
我正在使用 VS2017 15.9.2 和最新的 pybind11 off master
#include <pybind11/pybind11.h>
#include <pybind11/stl.h>
#include <vector>
#include <memory>
/* This fails to compile... */
struct myclass
{
std::vector<std::unique_ptr<int>> numbers;
};
/* ...but this works
struct myclass
{
std::unique_ptr<int> number;
};
*/
void test(py::module &m)
{
py::class_<myclass> pymy(m, "myclass");
pymy.def_static("make", []() {
myclass *m = new myclass;
return m;
}, py::return_value_policy::reference);
}
我解决了这个问题
复制构造函数和赋值运算符需要显式删除,即添加以下内容允许 pybind 识别它不能进行复制
myclass() = default;
myclass(const myclass &m) = delete;
myclass & operator= (const myclass &) = delete;
我一直在使用优秀的 pybind11 库,但遇到了障碍。 我需要 return 到 Python 一个指向不可复制对象的指针(因为该对象包含 unique_ptrs)。
一般来说,这在使用 return_value_policy::reference 的警告下工作正常。 但是,return 将指针指向具有不可复制向量的对象会导致编译错误。 在这种情况下,pybind 似乎想要执行复制,即使 return 值策略是引用并且函数明确地 return 是一个指针。
为什么会这样,是否有解决方法?
我正在使用 VS2017 15.9.2 和最新的 pybind11 off master
#include <pybind11/pybind11.h>
#include <pybind11/stl.h>
#include <vector>
#include <memory>
/* This fails to compile... */
struct myclass
{
std::vector<std::unique_ptr<int>> numbers;
};
/* ...but this works
struct myclass
{
std::unique_ptr<int> number;
};
*/
void test(py::module &m)
{
py::class_<myclass> pymy(m, "myclass");
pymy.def_static("make", []() {
myclass *m = new myclass;
return m;
}, py::return_value_policy::reference);
}
我解决了这个问题
复制构造函数和赋值运算符需要显式删除,即添加以下内容允许 pybind 识别它不能进行复制
myclass() = default;
myclass(const myclass &m) = delete;
myclass & operator= (const myclass &) = delete;