Boost Python wrap статическая перегрузка функции-члена с аргументом по умолчанию
у меня есть пример вложенной оболочки C++ для python: функция-член (метод) статична с аргументом по умолчанию. Поэтому я использую BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS для определения функции перегрузки. Нет ошибки компиляции, однако, когда я вызываю статическую функцию-член, я получил ошибку следующим образом:
import boostPythonTest
boostPythonTest.C.method("string")
--------------------------------------------------------------------------- ArgumentError Traceback (most recent call last) <ipython-input-4-ab141804179c> in <module>() ----> 1 boostPythonTest.C.method("string") ArgumentError: Python argument types in C.method(str) did not match C++ signature: method(class C {lvalue}, class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >) method(class C {lvalue}, class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >, int) method(class C {lvalue}, class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >, int, bool)
Я не понимаю, почему первая сгенерированная подпись - " class c {lvalue}". Если это так, статическая функция-член нуждается в экземпляре C для меня это выглядит противоречиво.
С другой стороны, я определяю другую статическую функцию-член без использования перегрузки функции-члена, она работает без подписи "class c {lvalue}". Например:
boostPythonTest.C.noDefaultArgMethod("string", 0, True)
тип: строка функции форма: Docstring: noDefaultArgMethod ((str)arg1, (int)arg2, (bool)arg3) - > int:
C++ signature : int noDefaultArgMethod(
класс std:: basic_string, класс std:: распределитель >, int, боол)
может ли кто - нибудь помочь объяснить проблему с BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS или дать некоторое предложение, как использовать его в качестве реальной статической функции-члена с перегрузкой?
#include <boost/python/module.hpp>
#include <boost/python/def.hpp>
#include <boost/python/args.hpp>
#include <boost/python/tuple.hpp>
#include <boost/python/class.hpp>
#include <boost/python/overloads.hpp>
#include <boost/python/return_internal_reference.hpp>
#include <boost/python/register_ptr_to_python.hpp>
#include <boost/python/object/class.hpp>
using namespace boost::python;
class C {
public:
static int method(const std::string &arg1, int arg2 = 0, bool arg3 = true) {
return 1;
};
static int noDefaultArgMethod(const std::string &arg1, int arg2 = 0, bool arg3 = true) {
return 10;
};
};
BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(method1, C::method, 1, 3)
BOOST_PYTHON_MODULE(boostPythonTest)
{
class_<C>("C")
.def("method", (int(C::*)(const std::string&, int, bool))0, method1())
.staticmethod("method")
.def("noDefaultArgMethod", &C::noDefaultArgMethod)
.staticmethod("noDefaultArgMethod");
}
1 ответов
Я верю этой строке:
.def("method", (int(C::*)(const std::string&, int, bool))0, method1())
должен выглядеть так:
.def("method", &C::method, method1())
и вы должны использовать BOOST_PYTHON_FUNCTION_OVERLOADS
вместо BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS
, так как нет C
вовлеченный объект (указатели статических функций-это просто указатели функций, они не являются указателями на члены).
есть также пример, размещенный на Вики с перегрузкой статических функций, где соответствующий раздел будет:
class X {
static int returnsum(int m, int x = 10) { return m + x; }
};
BOOST_PYTHON_FUNCTION_OVERLOADS(X_returnsum_overloads, X::returnsum, 1, 2)
BOOST_PYTHON_MODULE(foo)
{
class_<X>("X", ..)
.def("returnsum", &X::returnsum,
X_returnsum_overloads(args("x", "m"), "returnsum's docstring")
)
.staticmethod("returnsum")
;
}
это похоже на то, что вы хотеть.