我想使用Boost::Python绑定(bind)operator(),但是我真的不知道如何做到这一点。考虑以下示例:C++:class Queuer{public:void Queuer::operator()(const qfc::Queue & iq, const qfc::Message & im) const;void Queuer::operator()(const qfc::Agent & ia, const qfc::Message & im) const;// some other overloaded operator() methods};因此,在Python脚本中,导入我正在使用的模块(称为qfc)后,我想执行以下操作:Python:>>> queuer = qfc.Queuer()// instantiating a Message an Agent and a Queue object>>> queuer(queue,message)>>> queuer(agent,message)>>> ...您对如何操作有任何想法吗?也许用boost::python call ?谢谢,凯文 最佳答案 公开Queuer类时,请为每个__call__成员函数定义一个 Queuer::operator() 方法。 Boost.Python将根据类型处理适当的调度。指针成员函数语法引入了唯一的复杂性,因为要求调用者消除&Queuer::operator()的歧义。此外,当尝试使用基类的参数将Python中的派生类传递给C++函数时,需要向Boost.Python提供一些其他信息:基本的C++类需要使用 class_ 公开。例如,class_<BaseType>("Base")。 当使用 bases_ 公开时,派生类需要显式列出其基类。例如,class_<DerivedType, bases<BaseType> >("Derived")。有了这些信息,Boost.Python可以在调度时进行适当的转换。 这是一个完整的示例: #include <iostream>#include <boost/python.hpp>// Mockup classes.struct AgentBase {};struct MessageBase {};struct QueueBase {};struct SpamBase {};struct Agent: AgentBase {};struct Message: MessageBase {};struct Queue: QueueBase {};struct Spam: SpamBase {};// Class with overloaded operator().class Queuer{public: void operator()(const AgentBase&, const MessageBase&) const { std::cout << "Queuer::operator() with Agent." << std::endl; } void operator()(const QueueBase&, const MessageBase&) const { std::cout << "Queuer::operator() with Queue." << std::endl; } void operator()(const SpamBase&, const MessageBase&) const { std::cout << "Queuer::operator() with Spam." << std::endl; }};/// Depending on the overlaod signatures, helper types may make the/// code slightly more readable by reducing pointer-to-member-function syntax.template <typename A1>struct queuer_overload{ typedef void (Queuer::*type)(const A1&, const MessageBase&) const; static type get(type fn) { return fn; }};BOOST_PYTHON_MODULE(example){ namespace python = boost::python; // Expose only the base class types. Do not allow the classes to be // directly initialized in Python. python::class_<AgentBase >("AgentBase", python::no_init); python::class_<MessageBase>("MessageBase", python::no_init); python::class_<QueueBase >("QueueBase", python::no_init); python::class_<SpamBase >("SpamBase", python::no_init); // Expose the user types. These classes inerit from their respective // base classes. python::class_<Agent, python::bases<AgentBase> >("Agent"); python::class_<Message, python::bases<MessageBase> >("Message"); python::class_<Queue, python::bases<QueueBase> >("Queue"); python::class_<Spam, python::bases<SpamBase> >("Spam"); // Disambiguate via a varaible. queuer_overload<AgentBase>::type queuer_op_agent = &Queuer::operator(); python::class_<Queuer>("Queuer") // Disambiguate via a variable. .def("__call__", queuer_op_agent) // Disambiguate via a helper type. .def("__call__", queuer_overload<QueueBase>::get(&Queuer::operator())) // Disambiguate via explicit cast. .def("__call__", static_cast<void (Queuer::*)(const SpamBase&, const MessageBase&) const>( &Queuer::operator())) ;}及其用法: >>> import example>>> queuer = example.Queuer()>>> queuer(example.Agent(), example.Message())Queuer::operator() with Agent.>>> queuer(example.Queue(), example.Message())Queuer::operator() with Queue.>>> queuer(example.Spam(), example.Message())Queuer::operator() with Spam.关于binding - 提升python重载运算符(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18507244/ 10-11 05:00