gpt4 book ai didi

c++ - 使用 boost.python 导出 C++ 多态函数的聪明方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:01:12 26 4
gpt4 key购买 nike

我有一个高度多态的 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>);
}

这行得通,但我一直在想一定有更聪明的方法来做到这一点。因为我必须为许多功能做这件事,所以事情变得越来越大而且 super 重复。有什么建议吗?

最佳答案

对我来说,这看起来像是类型列表魔术的一种可能用途。

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

如果您无法访问新标准,您可以使用旧的递归类型列表做同样的事情。

关于c++ - 使用 boost.python 导出 C++ 多态函数的聪明方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6569761/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com