[C++-sig] Simple , , I think .. type conversion question C++ -> python
Tim Couper
tim at tizmoi.net
Wed Jan 13 19:24:19 CET 2010
OK. Here's what I've been stuck with all today .. I have a 3rd party C++
program function which returns a boost::variant (and its inverse)
my_variant my_variant_of_string(const std::string& str)
This one takes a string & returns a variant, and am trying to wrap this
in python, so that there I can have
>>> my_variant_of_string('hello')
'hello'
>>> my_variant_of_string('1.2')
1.2
>>> my_variant_of_string('10')
10
Simple, eh? .. The reduced code below compiles, creating the python
function correctly, but I have not successfully defined
to_python_value/to_python_converter statement(s), so the python
predictably fails with a ".. no to_python .. converter for ..
boost::variant .." when run.
I can find lots of helpful references to such converters of classes (eg
http://misspent.wordpress.com/2009/09/27/how-to-write-boost-python-converters/),
but cannot see how I should use the to_python_value functionality to
express the "convert the output of this function to a string, int or
double as appropriate".
Thanks
Tim "novice, but learning" Couper
-- my_variant.cpp --
#include <sstream>
typedef boost::variant<int, double, std::string> my_variant;
template <class T>
bool from_string(T& t,const std::string& s, std::ios_base&
(*f)(std::ios_base&))
{
std::istringstream iss(s);
return !(iss >> f >> t).fail();
}
namespace var {
my_variant my_variant_of_string(const std::string& str)
// return a float, int or string depending on input parameter
content
{
my_variant param;
double dval; int ival;
if (str.find(".") != std::string::npos) {
if (from_string<double>(dval,str,std::dec)) {
param = dval;
}
}
else if (from_string<int>(ival,str,std::dec) ) {
param = ival;
}
else {
param= str;
}
return param;
}
}// var
#include <boost/python/def.hpp>
#include <boost/python/module.hpp>
BOOST_PYTHON_MODULE(var)
{
using namespace boost::python;
def("my_variant_of_string", &var::my_variant_of_string);
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/cplusplus-sig/attachments/20100113/97739819/attachment.htm>
More information about the Cplusplus-sig
mailing list