gpt4 book ai didi

python - Boost Python用默认参数包装静态成员函数重载

转载 作者:太空狗 更新时间:2023-10-29 21:52:39 25 4
gpt4 key购买 nike

我有附加的 python 的 C++ 包装器示例:成员函数(方法)是静态的,带有默认参数。所以我使用 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)

Type: function String Form: Docstring: noDefaultArgMethod( (str)arg1, (int)arg2, (bool)arg3) -> int :

C++ signature :
int noDefaultArgMethod(

class std::basic_string,class std::allocator >, int, bool)

任何人都可以帮助解释 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");

}

最佳答案

我相信这条线:

.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 对象(静态函数指针只是函数指针,它们' re 不是指向成员的指针)。

this wiki 上也发布了一个示例重载静态函数,相关部分为:

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")
;
}

这似乎正是您想要的。

关于python - Boost Python用默认参数包装静态成员函数重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27963317/

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