Eu estou trabalhando na criação de uma interface de C ++ para python para uma API onde eu não tenho permissão para modificar uma parte significativa do C ++ para obter minha interface.
Eu escolhi Boost :: Python para usar como minha ponte de C ++ para python. Eu defini as seguintes partes do meu BOOST_PYTHON_MODULE:
Início da minha parte do C ++:
using namespace boost::python;
BOOST_PYTHON_MODULE(sandman_lib) {
class_<manblock::ManDriver>("ManDriver", init< ... >())
scope sandprogression = class_<SandProgression>("sandprogression");
def("api_create_sand_c_side_from_cfg_file", api_create_sand_c_side_from_cfg_file);
}
Do meu intérprete, meu uso dessa interface é o seguinte:
>>> import sandman_lib
>>> SAND = sandman_lib.sand_progression()
>>> SAND
<sandman_lib.sandprogression object at 0x7ffff7eaa998>
>>> SAND.api_create_sand_c_side_from_cfg_file("path_to_my_config_file")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
Boost.Python.ArgumentError: Python argument types in
sandprogression.api_create_sand_c_side_from_cfg_file(sandprogression, str)
did not match C++ signature:
api_create_sand_c_side_from_cfg_file(char const*)
Claro que, no escopo "sandprogression", temos o protótipo desta função que estamos tentando usar acima, ela é definida como:
extern "C" void api_create_sand_c_side_from_cfg_file(const char* cfg_file_name);
Eu teria assumido que certos tipos sãoautomaticamente conversível entre C ++ e Python, mas aparentemente este não é o caso. Eu tenho derramado sobre a documentação do boost para tentar entender como simplesmente configurar explicitamente o mapeamento, mas não consigo entender como ele é feito .
Respostas:
0 para resposta № 1sandman_lib.sandprogression.api_blah("path")
deve ser usado em vez de sandman_lib.sandprogression().api_blah("path")
. Olhe para a exemplo no boost.org.