Binding boostpython重载运算符()

Binding boostpython重载运算符(),binding,operator-overloading,boost-python,Binding,Operator Overloading,Boost Python,我想使用Boost::Python绑定操作符(),但我真的不知道如何做到这一点。考虑这个例子: C++: 因此,在Python脚本中,在导入我正在使用的模块(称为qfc)后,我想执行以下操作: Python: >>> queuer = qfc.Queuer() // instantiating a Message an Agent and a Queue object >>> queuer(queue,message) >>> queuer(

我想使用Boost::Python绑定操作符(),但我真的不知道如何做到这一点。考虑这个例子:

C++:

因此,在Python脚本中,在导入我正在使用的模块(称为qfc)后,我想执行以下操作:

Python:

>>> queuer = qfc.Queuer()
// instantiating a Message an Agent and a Queue object
>>> queuer(queue,message)
>>> queuer(agent,message)
>>> ...
你知道怎么做吗?可能使用boost::python调用

谢谢,,
Kevin

在公开
队列器
类时,为每个
队列器::操作符()定义一个方法。Python将根据类型处理适当的调度。唯一的复杂性是通过指向成员函数语法的指针引入的,因为调用方需要消除
&Queuer::operator()
的歧义

另外,当尝试将Python中的派生类传递给具有基类参数的C++函数时,则需要将某些附加信息暴露给Booj.Python:

  • 需要用C++来显示基础C++类。例如,
    类(“基”)
  • 当使用公开时,派生类需要显式列出其基类。例如,
    类(“派生”)
    。有了这些信息,Boost.Python可以在调度时进行适当的强制转换

下面是一个完整的示例:

#包括
#包括
//模型类。
结构试剂酶{};
结构MessageBase{};
结构QueueBase{};
结构SpamBase{};
结构代理:代理数据库{};
结构消息:MessageBase{};
结构队列:QueueBase{};
结构垃圾邮件:SpamBase{};
//使用重载运算符()初始化。
类排队器
{ 
公众:
void运算符()(常量AgentBase&,常量MessageBase&)常量
{
std::cout queuer=example.queuer()
>>>队列器(example.Agent(),example.Message())
带有代理的Queuer::operator()。
>>>队列器(example.Queue(),example.Message())
带有队列的Queuer::运算符()。
>>>队列器(example.Spam(),example.Message())
带有垃圾邮件的Queuer::operator()。
谢谢您的帮助

实际上,我已经测试了静态cast解决方案。实际上,在调用
queuer()时,我需要传递
qfc::lqs::Message
qfc::lqs::Agent
qfc::lqs::Spam
qfc::lqs::Message
例如,对于
qfc::lqs::Agent
分别继承自
qfc::Message
qfc::Agent

因此,我可以在调用操作符()时将qfc::lqs::Message
qfc::lqs::Agent
qfc::lqs::Spam
转换为
qfc::Message
qfc::Agent
qfc::Spam
,以便签名对应于操作符()

这是为了避免如下所示的错误:

error: invalid static_cast from type '<unresolved overloaded function type>' to type 'void (qfc::lqs::Queuer::*)(const qfc::lqs::Queue&, const qfc::lqs::Message&)const'
错误:无效的静态\u从类型“”转换为类型“void(qfc::lqs::Queuer::*)(常量qfc::lqs::Queue&,常量qfc::lqs::Message&)常量”

考虑使用此信息编辑原始问题,以供将来遇到此问题的用户使用。此外,我根据我认为与问题的更多部分一致的内容更新了答案。如果我误解了问题,请随意扩展。
error: invalid static_cast from type '<unresolved overloaded function type>' to type 'void (qfc::lqs::Queuer::*)(const qfc::lqs::Queue&, const qfc::lqs::Message&)const'