Вы должны прочитать соответствующую документацию Boost относительно аргументов по умолчанию.Я подведу итог ниже.
Проблема в том, что аргументы по умолчанию используются при вызове функций в 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
Макрос также существует для членов класса.Это в документации, если что-то неясно.