我只是面臨着一個有趣的挑戰,讓我們來解決它一起:如何將指針傳遞給模板類的成員函數?
我有一個類似的代理類:
//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
並傳遞對象,成員函數和參數(如上面所見)。 - 迄今爲止似乎很好!
但
的問題是,我只是有最近templetized的Broker
。因此,當我將Broker類和回調信息傳遞給ConnectionHandler
時,我不得不提供特定的(和無用的)模板參數。你看到問題了嗎?其實一邊試圖generalize
的Broker
,我不得不specialize
的ConnectionHandler
!通過它自己的ConnectionHandler,Broker模板參數沒有其他業務。
我想如果你能幫助我更好的建議傳遞函數指針ConnectionHandler而不涉及經紀模板參數,它會讓我的一天:)
謝謝
jogojapan,謝謝你的建議。選項-1:似乎是一個非常好的解決方案。我會嘗試一下並回復你。選項-2:在我的屍體:)因爲ConnectionHandler將成爲我的核心庫的一部分。經紀人也是如此!這就是爲什麼我將它推廣以便人們可以創建子類併爲其虛擬功能提供定義。如果在創建Broker子類的同時有一種方法可以爲模板化的ConnectionHandler自動指定參數類型,那麼這個選項也會回答我的需求。 – rahman
哦,所以你會接受使'ConnectionHandler'成爲一個模板,如果只有模板參數會在初始化時自動推斷出來?這可以做... – jogojapan
@rahman你可以使用C++ 11嗎? – jogojapan