ASPN ActiveState Programmer Network
ActiveState
/ Home / Perl / PHP / Python / Tcl / XSLT /
/ Safari / My ASPN /
Cookbooks | Documentation | Mailing Lists | Modules | News Feeds | Products | User Groups


Recent Messages
List Archives
About the List
List Leaders
Subscription Options

View Subscriptions
Help

View by Topic
ActiveState
.NET Framework
Open Source
Perl
PHP
Python
Tcl
Web Services
XML & XSLT

View by Category
Database
General
SOAP
System Administration
Tools
User Interfaces
Web Programming
XML Programming


MyASPN >> Mail Archive >> cpp-sig
cpp-sig
Re: [C++-sig] On wrapping vector >
by Nicodemus other posts by this author
Sep 30 2003 4:04AM messages near this date
[C++-sig] On wrapping vector > | Re: [C++-sig] Re: vector_indexing_suite too defensive ...
Zhang Le wrote:

> Hello, 
>   I'm trying to wrap a function that takes a vector<pair<string, double> >
>   as input and return a list. The original function is
>    vector<double> eval(const vector<pair<string, double> >&);
> 
>    to use boost python, I write a wrapper function:
>    python::list py_eval(python::tuple input) {
>           here I want to use python::extract<std::string>(input[i][0])
>           and python::extract<double>(py_context[i][1])
>           to transform python input [('A', 1.0), ('B', 2.0), ...]
>           into a new vector<pair<string, double> > for calling real
>           eval()
>    }
> 
>    Compilation is ok and I get an error in python code:
>    obj.py_eval([('A', 1.0), ('B', 2.0)])
>    TypeError: No registered converter was able to produce a C++ rvalue
>    of type j from this Python object of type str
> 
>    I change the declaration to python::list input, python::object input
>    and get the same error result.
> 
>    Am I missing anything?
>   
> 

It is hard to tell by your description of the problem alone, some code 
would help. But try this:

py::list py_eval(py::list v)
{
    vector< pair<string, double>  > input;
    int i;
    int len = py::extract<int> (v.attr("__len__")());
    for (i = 0; i < len; ++i) {
        string s = py::extract<string> (v[i][0]);
        double d = py::extract<double> (v[i][1]);
        input.push_back(pair<string, double> (s, d));
    }
    vector<double>  result = eval(input);
    py::list pyresult;
    for (i = 0; i < result.size(); ++i) {
        pyresult.append(result[i]);               
    }
    return pyresult;
}                                 


HTH,
Nicodemus.


_______________________________________________
C++-sig mailing list
C++-sig@[...].org
http://mail.python.org/mailman/listinfo/c++-sig
Thread:
Zhang Le
Nicodemus

Privacy Policy | Email Opt-out | Feedback | Syndication
© ActiveState Software Inc. All rights reserved