使用boost.python导出C++多态函数的智能方法

2 投票
1 回答
910 浏览
提问于 2025-04-16 20:47

我有一个非常灵活的C++函数,它可以用将近20种不同的类型来调用。

为了让它能在Python中使用,我正在做类似这样的事情:

#include originalFunctionNamespace.hpp

template<class T>
    T foo(T x)
    {
        return orignalFunctionNamespace::foo(x);
    }

但是,要从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

看起来这可能是一个使用类型列表魔法的好例子。

如果你正在使用(或者可以使用)新的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> ();

如果你不能使用这个新标准,你也可以用旧的递归类型列表来做类似的事情。

撰写回答