- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
#include <iostream>
#include <functional>
using namespace std;
template<class TReceiver, class TResult>
struct TMessage
{
virtual const TResult sendTo(const TReceiver&) const = 0;
virtual const TResult sendTo(TReceiver&) const = 0;
virtual ~TMessage(void){}
};
template<class TReceiver, class T, class TResult=void>
struct TTypedMessage : public TMessage<TReceiver, TResult>
{
T _data;
explicit TTypedMessage(const T& data):_data(data)
{}
const TResult sendTo(const TReceiver& functor) const
{
return functor(_data);
}
const TResult sendTo(TReceiver& functor) const
{
return functor(_data);
}
};
class T1
{
typedef T1 TThis;
public:
void operator()(const int& i)const{cout <<"int"<< i<<endl;}
void operator()(const double& i)const{cout <<"double"<< i<<endl;}
void operator()(const std::reference_wrapper<double>& i)const{cout <<"double&"<< i.get()<<endl;}
template<class T>
void operator()(const T& i)const{cout << "UnknowenMesage"<<endl;}
};
class T2
{
typedef T2 TThis;
public:
void operator()(int i)const{cout <<"int"<< i<<endl;}
void operator()(double i)const{cout <<"doble"<< i<<endl;}
void operator()(std::reference_wrapper<double> i)const{cout <<"double&"<< i.get()<<endl;}
};
template<class TMessage, class TReceiver, class TResult=void>
TResult sendMessage(TReceiver& Receiver, TMessage& Message)
{
TTypedMessage<TReceiver, TMessage, TResult> TypedMessage(Message);
return TypedMessage.sendTo(Receiver);
}
template<class TMessage, class TReceiver, class TResult=void>
TResult sendMessage(const TReceiver& Receiver, TMessage& Message)
{
TTypedMessage<TReceiver, TMessage, TResult> TypedMessage(Message);
return TypedMessage.sendTo(Receiver);
}
template<class TMessage, class TReceiver, class TResult=void>
TResult sendMessage(TReceiver& Receiver, const TMessage& Message)
{
TTypedMessage<TReceiver, TMessage, TResult> TypedMessage(Message);
return TypedMessage.sendTo(Receiver);
}
template<class TMessage, class TReceiver, class TResult=void>
TResult sendMessage(const TReceiver& Receiver, const TMessage& Message)
{
TTypedMessage<TReceiver, TMessage, TResult> TypedMessage(Message);
return TypedMessage.sendTo(Receiver);
}
int main() {
T1 a;
T2 b;
sendMessage(a, 10);
sendMessage(a, 10.0);
double d=0;
sendMessage(a, std::ref(d));
sendMessage(b, 10);
sendMessage(b, 10.0);
sendMessage(b, std::ref(d));
sendMessage(a, string("kokoko"));
int aa=6;
sendMessage(a, aa);
return 0;
}