Среда: Boost 1.61.0, скомпилированная с Python 3.5
Следующие выводы кода 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
использоваться здесь?
Хорошая статья о обработка исключений Python в C ++. В любом случае, я думаю, Python за исключением AttributeError
из-за разницы в reference_wrapper
реализации в станд а также увеличение библиотеки. Вы можете увидеть разницу даже в общедоступном интерфейсе. std::reference_wrapper
не имеет get_pointer()
метод.
Других решений пока нет …