我有一个C++函数,它返回一个结构列表。在结构内部,有更多的结构列表。
struct CameraInfo {
CamName name;
std::list<CamImageFormat> lImgFormats;
std::list<CamControls> lCamControls;
};
std::list<CameraInfo> getCameraInfo()
{
std::list<CameraInfo> lCamerasInfo;
// fill lCamerasInfo
return lCamerasInfo;
}
然后用于导出它,我正在使用:
class_<CameraNode....> >("CameraNode", no_init)
...
...
.def("listCameraInfo", make_function(&CameraNode::listCameraInfo))
.staticmethod("listCameraInfo")
...
;
没关系,因为我使用cout在屏幕上打印数据...我现在想使用返回值,它的内容来自python这样的属性,例如:
cameras = []
cameras = CameraNode.getCameraInfo()
print cameras[0].name
print cameras[0].lImgFormats[0]
and so on...
这有可能吗?我应该改用add_property吗?我认为我不能为每个结构创建一个类。仅当我使用C++时,这种设计才有意义,但现在我不得不包装它,这让我越来越困惑。
以一般方式包装带有boost.python的std::list的任何建议都将被很好地接受。
编辑:
我将在此处添加我认为有用的链接:
Iterators
StlContainers
参考方案
一定是std::list
吗?如果改用std::vector
,则可以使用boost::python::vector_indexing_suite
包裹列表。有关详细信息,请参见this post。
如果必须使用std::list
,则需要创建一个帮助程序类,该类使用python的std::list
方法包装list
功能。这可能涉及很多,但可行。
std_item.hpp:
#include <list>
#include <algorithm>
#include <boost/python.hpp>
template<class T>
struct listwrap
{
typedef typename T::value_type value_type;
typedef typename T::iterator iter_type;
static void add(T & x, value_type const& v)
{
x.push_back(v);
}
static bool in(T const& x, value_type const& v)
{
return std::find(x.begin(), x.end(), v) != x.end();
}
static int index(T const& x, value_type const& v)
{
int i = 0;
for(T::const_iterator it=x.begin(); it!=x.end(); ++it,++i)
if( *it == v ) return i;
PyErr_SetString(PyExc_ValueError, "Value not in the list");
throw boost::python::error_already_set();
}
static void del(T& x, int i)
{
if( i<0 )
i += x.size();
iter_type it = x.begin();
for (int pos = 0; pos < i; ++pos)
++it;
if( i >= 0 && i < (int)x.size() ) {
x.erase(it);
} else {
PyErr_SetString(PyExc_IndexError, "Index out of range");
boost::python::throw_error_already_set();
}
}
static value_type& get(T& x, int i)
{
if( i < 0 )
i += x.size();
if( i >= 0 && i < (int)x.size() ) {
iter_type it = x.begin();
for(int pos = 0; pos < i; ++pos)
++it;
return *it;
} else {
PyErr_SetString(PyExc_IndexError, "Index out of range");
throw boost::python::error_already_set();
}
}
static void set(T& x, int i, value_type const& v)
{
if( i < 0 )
i += x.size();
if( i >= 0 && i < (int)x.size() ) {
iter_type it = x.begin();
for(int pos = 0; pos < i; ++pos)
++it;
*it = v;
} else {
PyErr_SetString(PyExc_IndexError, "Index out of range");
boost::python::throw_error_already_set();
}
}
};
template<class T>
void export_STLList(const char* typeName)
{
using namespace boost::python;
class_<std::list<T> >(typeName)
.def("__len__", &std::list<T>::size)
.def("clear", &std::list<T>::clear)
.def("append", &listwrap<T>::add,
with_custodian_and_ward<1,2>()) // to let container keep value
.def("__getitem__", &listwrap<T>::get,
return_value_policy<copy_non_const_reference>())
.def("__setitem__", &listwrap<T>::set,
with_custodian_and_ward<1,2>()) // to let container keep value
.def("__delitem__", &listwrap<T>::del)
.def("__contains__", &listwrap<T>::in)
.def("__iter__", iterator<std::list<T> >())
.def("index", &listwrap<T>::index);
}
用法:
typedef std::list<int> intlist;
export_STLList<int>("intlist");
在Java中,执行“ ++++++++”表达式,编译器未报告任何错误并且可以正确执行? - java我用eclipse编写了这段代码,用war写过,结果为3d。public static void main(String[] args) { double a = 5d + + + + + +-+3d; System.out.println(a); } 参考方案 您的表情可以改写为(5d) + (+ + + + +-+3d) 其中第一个+是应用于两个操作数的…
如何用Cython保持C++类名不变? - c++我有一个名为Foo的C++类。如果遵循Cython C++ tutorial,则需要以其他方式调用Python类,例如PyFoo。但是我确实也需要调用Python类Foo。如何有效地做到这一点?编辑:我正在尝试接口以前与Boost Python接口的现有C++库。由于不同的原因,我想测试Cython。由于使用Boost:Python调用了Python类,因此…
SWIG和C++共享库 - c++我有一个C++库(我们将其称为mylib)编译为libmylib.so中的/usr/local/lib文件,并且我在my lib中一个名为/usr/local/include的目录中有许多头文件。现在,我想做的(对于初学者而言)只是将其中一个头文件(包含有关我的图书馆提供的类的信息)与SWIG一起使用,以生成mylib_wrap.cxx文件,然后进行编译并将…
从C++调用Python函数 - c++我正在尝试从C++实现调用Python函数。我以为可以通过函数指针来实现,但是似乎不可能。我一直在使用boost.python完成此操作。假设在Python中定义了一个函数:def callback(arg1, arg2): #do something return something 现在,我需要将此函数传递给C++,以便可以从那里调用它。如何使用boos…
在Python中制作Qt / C++原型 - c++我想用Qt编写一个C++应用程序,但是先使用Python构建一个原型,然后逐渐用C++替换Python代码。这是正确的方法吗?我应该使用哪些工具(绑定,绑定生成器,IDE)?理想情况下,所有内容都应该在Ubuntu存储库中可用,因此我不必担心不兼容或旧版本,并使用简单的aptitude install设置所有内容。是否有关于此过程的全面文档,还是我必须学习每…