我刚刚遇到了一个有趣的挑战,让我们一起解决它:
我有一个与此类似的 Broker 类:
//Broker.h
#pragma once
#include <boost/shared_ptr.hpp>
template<class AGENT_MSG_TYPE,class BUFFER_MSG_TYPE>
class Broker
{
public:
void messageReceiveCallback(boost::shared_ptr<ConnectionHandler>cnnHadler , std::string message){}
};
和这样的连接处理程序:
//ConnectionHandler.h
#pragma once
#include <boost/enable_shared_from_this.hpp>
#include <iostream>
//connection handler
#define CALL_MEMBER_FN(object, ptrToMember) ((object).*(ptrToMember))
template<class A,class B>
class Broker;
class ConnectionHandler: public boost::enable_shared_from_this<ConnectionHandler>
{
typedef void (Broker<int,int>::*messageReceiveCallback)(boost::shared_ptr<ConnectionHandler>,std::string);
messageReceiveCallback receiveCallBack;
Broker<int,int> &theBroker;
public:
ConnectionHandler(
//...
Broker<int,int>& broker,
messageReceiveCallback callback
//,...
);
void some_function(std::string incomingMessage);
};
///////////////////ConnectionHandler.cpp
#include "cnn.h"
#include "Broker.h"
ConnectionHandler::ConnectionHandler(
//...
Broker<int,int>& broker, messageReceiveCallback callback
//...
) :
receiveCallBack(callback), theBroker(broker) {
}
void ConnectionHandler::some_function(std::string incomingMessage) {
CALL_MEMBER_FN(theBroker, receiveCallBack)(shared_from_this(),incomingMessage);
}
- 正如您所看到的,其中一项
ConnectionHandler
职责是Broker
通过调用代理的回调函数(查看ConnectionHandler::some_function
)将传入消息传递给。 - 我知道调用回调函数的唯一方法是定义一个宏
CALL_MEMBER_FN
并传递对象、成员函数和参数,就像您在上面看到的那样。 - 到目前为止似乎很好!
但
问题是,我最近刚刚将Broker
. 因此,在将Broker类和回调信息传递给ConnectionHandler
. 你看到问题了吗?其实在尝试generalize
的时候Broker
,我已经到specialize
了ConnectionHandler
!ConnectionHandler 本身没有与 Broker 模板参数相关的其他业务。
我认为,如果您可以在不涉及 Broker 模板参数的情况下向我提供更好的建议,将函数指针传递给 ConnectionHandler,那会让我很开心:)
谢谢你