[C++-sig] boost python how to handle a type of shared_ptr<const T>
Dalton, Barnaby
Barnaby.Dalton at brevanhoward.com
Mon Apr 3 19:15:07 CEST 2006
How do I use a shared_ptr<const T> type in boost python? I have the
following test code:
#include <vector>
#include <boost/shared_ptr.hpp>
using namespace std;
using namespace boost;
// vector
vector<int> listTest1()
{
vector<int> a;
a.push_back(5); a.push_back(10);
return a;
}
// shared pointer to vector
shared_ptr<vector<int> > listTest2()
{
shared_ptr<vector<int> > a(new vector<int>());
a->push_back(6); a->push_back(11);
return a;
}
// const vector
const vector<int> listTest3()
{
vector<int> a;
a.push_back(7); a.push_back(12);
return a;
}
// shared pointer to const vector
shared_ptr<const vector<int> > listTest4()
{
shared_ptr<vector<int> > a(new vector<int>());
a->push_back(8); a->push_back(13);
return a;
}
#include <boost/python/module.hpp>
#include <boost/python/def.hpp>
#include <boost/python/iterator.hpp>
#include <boost/python/register_ptr_to_python.hpp>
using namespace boost::python;
BOOST_PYTHON_MODULE(hello)
{
class_<vector<int> >("vec_int")
.def("push_back", &vector<int>::push_back)
.def("__iter__", iterator<vector<int> >())
;
def("listTest1", listTest1);
def("listTest2", listTest2);
def("listTest3", listTest3);
def("listTest4", listTest4);
register_ptr_to_python< boost::shared_ptr<vector <int> > >();
//register_ptr_to_python< boost::shared_ptr<const vector <int> >
>();
}
listTest 1->3 work fine. If I try and call listTest4 from python I get:
Traceback (most recent call last):
File "test.py", line 19, in ?
a = [x for x in hello.listTest4()]
TypeError: No to_python (by-value) converter found for C++ type: class
boost::shared_ptr<class std::vector<int,class std::allocator<int> >
const >
If I uncomment 'register_ptr_to_python< boost::shared_ptr<const vector
<int> > >();' then I get compile errors:
C:\Source\boost_1_33_1\boost\python\object\pointer_holder.hpp(138) :
error C2664: 'boost::python::objects::find_dynamic_type' : cannot
convert parameter 1 from 'const X *' to 'void *'
Conversion loses qualifiers
C:\Program Files\Microsoft Visual Studio .NET
2003\Vc7\include\vector(152) : while compiling class-template member
function 'void
*boost::python::objects::pointer_holder<Pointer,Value>::holds(boost::pyt
hon::type_info,bool)'
with
[
Pointer=boost::shared_ptr<const std::vector<int>>,
Value=const X
]
etc....
I'm new to boost python so please feel free to point to any
documentation/examples I might have missed.
Thanks
Barney
More information about the Cplusplus-sig
mailing list