-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathGCP_Delegate.h
69 lines (68 loc) · 2.2 KB
/
GCP_Delegate.h
1
2
3
4
5
6
7
8
9
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
#ifndef GCP_DelegateH
#define GCP_DelegateH
/////////////////////////////////
//http://habrahabr.ru/post/78299/
/////////////////////////////////
#include <assert.h>
namespace gcp
{
//////////////////////////////////////////////////////////////////
// Êîíòåéíåð äëÿ õðàíåíèÿ äî 2-õ àðãóìåíòîâ.
//////////////////////////////////////////////////////////////////
struct NIL {};
class IArguments { public: virtual ~IArguments() {} };
template< class T1 = NIL, class T2 = NIL>
class Arguments : public IArguments
{
public: Arguments() {}
public: Arguments(T1 i_arg1) :
arg1(i_arg1) {}
public: Arguments(T1 i_arg1, T2 i_arg2) :
arg1(i_arg1), arg2(i_arg2) {}
public: T1 arg1; T2 arg2;
};
//////////////////////////////////////////////////////////////////
// Êîíòåéíåð äëÿ õðàíåíèÿ óêàçàòåëÿ íà ìåòîä.
//////////////////////////////////////////////////////////////////
class IContainer {
public:
virtual void* Call(void* arg){ return (void*)0; };
virtual ~IContainer(){};
};
template< class T, class M>
class Container : public IContainer {};
//////////////////////////////////////////////////////////////////
// Ñïåöèàëèçàöèÿ äëÿ ìåòîäà c âõîäíûì àðãóìåíòîì void*
//////////////////////////////////////////////////////////////////
template< class T>
class Container< T, void (T::*)(void*) > : public IContainer
{
typedef void (T::*M)(void*);
public: Container(T* c, M m) : m_class(c), m_method(m) {}
private: T* m_class; M m_method;
public:
void* Call(void* i_arg1)
{
(m_class->*m_method)(i_arg1);
return (void*)0;
}
//~Container(){delete m_class;}
};
//////////////////////////////////////////////////////////////////
// Ñïåöèàëèçàöèÿ äëÿ ìåòîäà c âõîäíûì àðãóìåíòîì void* è âûõîäíûì àðãóìåíòîì void*
//////////////////////////////////////////////////////////////////
template< class T>
class Container< T, void* (T::*)(void*) > : public IContainer
{
typedef void* (T::*M)(void*);
public: Container(T* c, M m) : m_class(c), m_method(m) {}
private: T* m_class; M m_method;
public:
void* Call(void* i_arg1)
{
return (m_class->*m_method)(i_arg1);
}
//~Container(){delete m_class;}
};
}
#endif