Ah I understand .. so will reply to my own posting for others new to pb ...
C++ constructors with one argument behave differently I understand, so
taking a 2 argument case:
class A
{
public
A(int i, const std::vector<std::vector double >>& my_array);
};
In the BOOST_PYTHON_MODULE(foo) ..
define a type using typedef:
typedef std::vector<std::vector<double> > double_trouble;
and add the python wrappers we're going to need - one for wrapping a
vector of doubles, and one for the vector of vectors ..
class_<std::vector<std::vector<double> > > ("v2_double")
.def(vector_indexing_suite<std::vector<std::vector<double> > >());
class_<std::vector<double> > ("v_double")
.def(vector_indexing_suite<std::vector<double> >());
now define the constructor like Troy said ..
class_<duh::A>("A")
.def(init<int, double_trouble >())
;
bjam this lot and we then can write out nosetest tests:
def test_v_double():
v = foo.v_double()
v[:] = [1.4,2.5]
assert_equals(len(v),2)
assert_almost_equal(v[0],1.4)
def test_v2_double():
v2 = foo.v2_double()
v1a = foo.v_double()
v2a = foo.v_double()
v1a[:] = [1.4, 2.5, 5.6]
v2a[:] = [3.4, 2.8, 7.8, 12.5]
v2[:] = [v1a,v2a]
assert_equals(len(v2),2)
assert_almost_equal(v2[0][0],1.4)
def test_A():
v2 = foo.v2_double()
v1a = foo.v_double()
v2a = foo.v_double()
v1a[:] = [1.4, 2.5, 5.6]
v2a[:] = [3.4, 2.8, 7.8, 12.5]
v2[:] = [v1a,v2a]
res = foo.A(1, v2)
assert isinstance(res, foo.A)
and there we have it ..
I'll be back ... :-)
Tim
On 07/01/2010 09:21, Tim Couper wrote:
Troy
Thanks for the prompt reply .. I'm a python expert and a C++ novice
... Apologies for not getting this ...
I've seen I can define a python mapping using the vector_indexing suite
class_< std::vector< std::vector<double> > >("vector_double2")
.def(vector_indexing_suite<std::vector< std::vector<double> > >
but I can't see how to get that information into the init argument in
the C++
class_<A>("A")
.def(init<vector_double2>( ))
as vector_double2 isn't known when the c++ compiles, so this clearly
isn't the "type" argument to which you refer. Clearly there's
something I'm missing. How do I define a type? Should I be using the
named constructors/factories described in
http://wiki.python.org/moin/boost.python/HowTo? If so how?
Thanks again
Tim
On 06/01/2010 23:16, troy d. straszheim wrote:
Tim Couper wrote:
I'm trying to boost-python a vector-of-vectors, like
class A
{
public
A(const std::vector<std::vector double >>& my_array);
};
and would intuitively write the wrapper:
BOOST_PYTHON_MODULE(foo)
{
using namespace boost::python
class_<A>("A")
.def(init(std::vector<std::vector<double> >())
;
but get the error "a call to a constructor cannot appear in a
constant expression"
Syntax error, init takes a type argument: init<T>()
-t
_______________________________________________
Cplusplus-sig mailing list
Cplusplus-sig@python.org
http://mail.python.org/mailman/listinfo/cplusplus-sig
No virus found in this incoming message.
Checked by AVG -www.avg.com
Version: 9.0.725 / Virus Database: 270.14.127/2603 - Release Date: 01/06/10
07:35:00
_______________________________________________
Cplusplus-sig mailing list
Cplusplus-sig@python.org
http://mail.python.org/mailman/listinfo/cplusplus-sig
No virus found in this incoming message.
Checked by AVG - www.avg.com
Version: 9.0.725 / Virus Database: 270.14.128/2604 - Release Date: 01/06/10
19:35:00
_______________________________________________
Cplusplus-sig mailing list
Cplusplus-sig@python.org
http://mail.python.org/mailman/listinfo/cplusplus-sig