Binding boostpython重载运算符()
我想使用Boost::Python绑定操作符(),但我真的不知道如何做到这一点。考虑这个例子: C++: 因此,在Python脚本中,在导入我正在使用的模块(称为qfc)后,我想执行以下操作: Python: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(
>>> 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'