Умный способ экспортировать полиморфные функции c ++ с boost.python - PullRequest
2 голосов
/ 04 июля 2011

У меня есть высокополиморфная функция c ++, которую можно вызывать с почти 20 различными типами.

Чтобы представить ее на python, я делаю что-то вроде этого:но затем, чтобы вызвать их из python, я должен специализировать функции для каждого поддерживаемого ими типа:

BOOST_PYTHON_MODULE(module_foo)
{
    def("foo", foo<orignalFunctionNamespace::type1>);
    def("foo", foo<orignalFunctionNamespace::type2>);
    def("foo", foo<orignalFunctionNamespace::type3>);
    def("foo", foo<orignalFunctionNamespace::type4>);
    def("foo", foo<orignalFunctionNamespace::type5>);
    def("foo", foo<orignalFunctionNamespace::type6>);
    def("foo", foo<orignalFunctionNamespace::type7>);
    ...
    ...
    ...
    def("foo", foo<orignalFunctionNamespace::typeN>);
}

Это работает, но я не могу перестать думать, что должен быть более разумный способ сделать это.Так как я должен сделать это для многих функций, все становится очень большим и повторяющимся.Есть предложения?

1 Ответ

0 голосов
/ 04 июля 2011

Похоже, что я могу использовать магию наборов слов.

Если вы используете (или можете использовать) новый стандарт C ++ 0x, вы можете написать что-то вроде этого:

template <typename ArgType>
void def_foo_overloads()
{
    def("foo", foo<ArgType>);
    // last type in list
}
template <typename ArgType, typename... MoreArgTypes>
void def_foo_overloads()
{
    def("foo", foo<ArgType>);
    def_foo_overloads(MoreArgTypes...);
}

// use it like:
def_foo_overloads<orignalFunctionNamespace::type1,
                  orignalFunctionNamespace::type2,
                  ...
                  orignalFunctionNamespace::typeN> ();

Если у вас нет доступа к новому стандарту, вы можете сделать то же самое, используя старые рекурсивные списки типов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...