Я просто столкнулся с интересной проблемой, давайте решать вместе:как передать указатель на функцию-член класса шаблона?
У меня был класс брокера, похожее на это:
//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
и передать объект, функцию-член и аргументы (-и), как то, что вы видели выше. - пока кажется, что так хорошо!
НО
Проблема заключается в том, что я просто недавно templetizedBroker
. Следовательно, я был вынужден предоставить конкретные аргументы шаблона (и бесполезные) при передаче класса брокера и информации обратного вызова до ConnectionHandler
. Ты видишь проблему? На самом деле, пытаясь до generalize
Broker
, мне пришлось specialize
ConnectionHandler
! ConnectionHandler, по своему усмотрению, не имеет другого бизнеса с аргументами шаблона Broker.
Я думаю, если вы могли бы мне помочь с лучшим предложением для передачи указателя функции в ConnectionHandler без привлечения аргументов шаблона брокера, это сделает мой день :)
спасибо
jogojapan, спасибо за ваши предложения. options-1: кажется очень приятным решением. Я просто попробую и вернусь к вам. option-2: над моим мертвым телом :) coz ConnectionHandler будет частью моей основной библиотеки. Так же и Брокер! поэтому я обобщаю его так, чтобы люди могли создавать подклассы и предоставлять определение для своих виртуальных функций. если бы был способ автоматически указывать типы аргументов для templatized ConnectionHandler в то же время, когда я создаю подкласс Broker, этот вариант также будет отвечать моим потребностям. – rahman
О, так что вы согласитесь сделать шаблон «ConnectionHandler», если только аргументы шаблона будут автоматически выведены во время инициализации? Это можно сделать ... – jogojapan
@rahman Можете ли вы использовать C++ 11? – jogojapan