Necesito construir enlaces python para una base de código C++. Utilizo boost :: python y encontré problemas al tratar de exponer las clases que contienen funciones que usan y devuelven plantillas. Aquí está un ejemplo típicoBoost :: python Exponer funciones C++ usando y devolviendo plantillas
class Foo
{
public:
Foo();
template<typename T> Foo& setValue(
const string& propertyName, const T& value);
template<typename T> const T& getValue(
const string& propertyName);
};
Típico T son de cadena, doble, vector.
Después de leer el documentation, traté de usar envoltorios finos para cada tipo usado. Aquí están los envoltorios para cadena y doble y la declaración de clase correspondiente.
Foo & (Foo::*setValueDouble)(const std::string&,const double &) =
&Foo::setValue;
const double & (Foo::*getValueDouble)(const std::string&) =
&Foo::getValue;
Foo & (Foo::*setValueString)(const std::string&,const std::string &) =
&Foo::setValue;
const std::string & (Foo::*getValueString)(const std::string&) =
&Foo::getValue;
class_<Foo>("Foo")
.def("setValue",setValueDouble,
return_value_policy<reference_existing_object>())
.def("getValue",getValueDouble,
return_value_policy<copy_const_reference>())
.def("getValue",getValueString,
return_value_policy<copy_const_reference>())
.def("setValue",setValueString,
return_value_policy<reference_existing_object>());
Compila bien, pero cuando intento usar los enlaces de python, obtengo una excepción de C++.
>>> f = Foo()
>>> f.setValue("key",1.0)
>>> f.getValue("key")
Traceback (most recent call last):
File "<stdin>", line 1, in ?
RuntimeError: unidentifiable C++ exception
Curiosamente, cuando sólo expongo Foo por el valor doble o de cadena, es decir
class_<Foo>("Foo")
.def("getValue",getValueString,
return_value_policy<copy_const_reference>())
.def("setValue",setValueString,
return_value_policy<reference_existing_object>());
funciona bien. ¿Me estoy perdiendo algo?
es posible que desee ver en el hilo en http://mail.python.org/pipermail/cplusplus-sig/2006-February/009990.html (que aborda un problema similar: envolver cualquier impulso ::) – lijie