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

时间:2011-07-04 09:45:25

标签: c++ python templates boost polymorphism

我有一个高度多态的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 :(得分: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> ();

如果您无法访问新标准,则可以使用旧的递归类型列表执行相同的操作。