为什么不能使用 std::ref 将对象传递到 Boost.Python 模块中?
Why can't std::ref be used to pass objects into Boost.Python modules?
环境:使用 Python 3.5
编译的 Boost 1.61.0
以下 C++ 代码输出 12
:
class A
{
public:
int func() { return 12; }
};
BOOST_PYTHON_MODULE(bridge)
{
using namespace boost::python;
class_<A>("A", no_init)
.def("func", &A::func);
}
int main()
{
A a;
PyImport_AppendInittab("bridge", PyInit_bridge);
Py_Initialize();
using namespace boost::python;
dict dictMain = extract<dict>(import("__main__").attr("__dict__"));
import("bridge").attr("a") = boost::ref(a);
exec("import bridge", dictMain);
exec("print(bridge.a.func())", dictMain);
}
但是,如果我将 boost::ref
替换为 std::ref
,则会抛出一个 boost::python::error_already_set
实例。
这里为什么不能用std::ref
?
关于 handling python exceptions in C++. Any way I guess python through exception AttributeError
because of difference in reference_wrapper
implementations in std and boost 库的好文章。您甚至可以在 public 界面中看到差异。 std::reference_wrapper
没有 get_pointer()
方法。
环境:使用 Python 3.5
编译的 Boost 1.61.0以下 C++ 代码输出 12
:
class A
{
public:
int func() { return 12; }
};
BOOST_PYTHON_MODULE(bridge)
{
using namespace boost::python;
class_<A>("A", no_init)
.def("func", &A::func);
}
int main()
{
A a;
PyImport_AppendInittab("bridge", PyInit_bridge);
Py_Initialize();
using namespace boost::python;
dict dictMain = extract<dict>(import("__main__").attr("__dict__"));
import("bridge").attr("a") = boost::ref(a);
exec("import bridge", dictMain);
exec("print(bridge.a.func())", dictMain);
}
但是,如果我将 boost::ref
替换为 std::ref
,则会抛出一个 boost::python::error_already_set
实例。
这里为什么不能用std::ref
?
关于 handling python exceptions in C++. Any way I guess python through exception AttributeError
because of difference in reference_wrapper
implementations in std and boost 库的好文章。您甚至可以在 public 界面中看到差异。 std::reference_wrapper
没有 get_pointer()
方法。