gpt4 book ai didi

c++ - 导出模板功能

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

使用 boost.python 将模板函数从 C++ 导出到 Python 的正确方法是什么?这是代码:

template<typename T>
T getValue(const std::string &key, const T &defaultValue = T()) {}

// Export into some python class:
class_<ConfigManager>(...)
.def("GetValue", getValue<int>)
.def("GetValue", getValue<float>)
.def("GetValue", getValue<std::string>);

和用法:

    print GetValue("width")
Boost.Python.ArgumentError: Python argument types in
GetValue(ConfigManager, str)
did not match C++ signature:
GetValue(ConfigManager {lvalue}, std::string, int)

怎么了?

最佳答案

你应该阅读相关的Boost documentation关于默认参数。我将在下面进行总结。


这里的问题是在C++ 中调用函数时使用默认参数。摆脱它们,您将从 Python 的角度看到问题:

// this function *must* be called with two parameters
template<typename T>
T getValue(const std::string &key, const T &defaultValue) {}

class_<ConfigManager>(...)
.def("GetValue", getValue<int>) // two arguments!
.def("GetValue", getValue<float>) // Python has no idea about the defaults,
.def("GetValue", getValue<std::string>); // they are a C++ feature for calling

根本问题是函数类型不携带默认参数信息。那么我们如何模拟呢?本质上,通过重载:

template<typename T>
T getValue(const std::string &key, const T &defaultValue) {}

template<typename T>
T getValueDefault(const std::string &key)
{
// default available in C++,
// transitively available in Python
return getValue(key);
}

class_<ConfigManager>(...)
.def("GetValue", getValue<int>) // two arguments
.def("GetValue", getValueDefault<int>) // one argument
// and so on

维护麻烦。幸运的是,Boost 使这一切变得简单:

template<typename T>
T getValue(const std::string &key, const T &defaultValue) {}

// creates utility class x, which creates overloads of function y,
// with argument count as low as a and as high as b:
// BOOST_PYTHON_FUNCTION_OVERLOADS(x, y, a, b);

BOOST_PYTHON_FUNCTION_OVERLOADS(getValueIntOverloads, getValue<int>, 1, 2);

class_<ConfigManager>(...)
.def("GetValue", getValue<int>, getValueIntOverloads()) // one or two arguments

// and so on

该宏也适用于类(class)成员。这在文档中,如果有任何不清楚的话。

关于c++ - 导出模板功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5357411/

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