我只是面临着一个有趣的挑战,让我们来解决它一起:如何将指针传递给模板类的成员函数?
我有一个类似的代理类:
//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