language: C++11 (gcc-4.7.2)
date: 777 days 15 hours ago
link:
visibility: public
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
70
71
72
73
74
75
76
77
78
79
80
81
82
#include <iostream>
 
template< class T > struct identity { typedef T type; };
 
struct DelayedSignal
{   
    ~DelayedSignal ()
    { std::cout << "~DelayedSignal CLOSE" << std::endl; }
 
    template<class C, class... Args>
    DelayedSignal ( void(C::*func)(Args...), C& obj )
    { std::cout << "DelayedSignal INIT - 03 - pointer to method & pointer to class instance (Arg num: " << sizeof...(Args) << ")" << std::endl; }
 
    template<class C, class... Args>
    DelayedSignal ( void(C::*func)(Args...), C& obj, typename identity<Args>::type... args )
    {
        std::cout << "DelayedSignal INIT - 04 - pointer to method & pointer to class instance & arguments (Arg num: " << sizeof...(Args) << ")" << std::endl;
    }
};
 
template<class... ArgsBis>
struct DelayedSignal_DebugHelper 
{
    ~DelayedSignal_DebugHelper ()
    { std::cout << "~DelayedSignal_DebugHelper CLOSE" << std::endl; }
 
    template<class C, class... Args>
    DelayedSignal_DebugHelper ( void(C::*func)(Args...), C& obj )
    { std::cout << "DelayedSignal_DebugHelper INIT - 03 - pointer to method & pointer to class instance (Arg num: " << sizeof...(Args) << ")" << std::endl; }
 
    template<class C, class... Args>
    DelayedSignal_DebugHelper ( void(C::*func)(Args...), C& obj, ArgsBis... args ) // Need to use ArgsBis instead of Args to make it work
    {
        std::cout << "DelayedSignal_DebugHelper INIT - 04 - pointer to method & pointer to class instance & arguments (Arg num: " << sizeof...(Args) << ")" << std::endl;
    }
};
 
 
template < class Tr, class... Args >
struct Signal
{
    void fire ( Args... args ) { std::cout << "Signal::fire::" << sizeof...(Args) << std::endl; }
};
 
struct Klass {};
 
 
int main()
{
    std::string str1("Blop");   // Will be used as reference
    Klass k;                    // Will be used as reference
 
    Signal<void, Klass&> signal_01;
    Signal<void, std::string&> signal_02;
 
    std::cout << "====== DelayedSignal :: needed for production purpose ===============" << std::endl;
 
    // OK
    DelayedSignal test01(&Signal<void, std::string&>::fire, signal_02);
    // HERE IS THE PROBLEM
    DelayedSignal test02(&Signal<void, std::string&>::fire, signal_02, str1);
 
    // OK
    DelayedSignal test03(&Signal<void, Klass&>::fire, signal_01);
    // HERE IS THE PROBLEM
    DelayedSignal test04(&Signal<void, Klass&>::fire, signal_01, k);
 
    std::cout << "====== DelayedSignal_DebugHelper :: used only for debug purpose ======" << std::endl;
 
    // OK
    DelayedSignal_DebugHelper<std::string&> test05(&Signal<void, std::string&>::fire, signal_02);
    // OK
    DelayedSignal_DebugHelper<std::string&> test06(&Signal<void, std::string&>::fire, signal_02, str1);
 
    // OK
    DelayedSignal_DebugHelper<Klass&> test07(&Signal<void, Klass&>::fire, signal_01);
    // OK
    DelayedSignal_DebugHelper<Klass&> test08(&Signal<void, Klass&>::fire, signal_01, k);
 
    return 1;
}
 
  • upload with new input
  • result: Success     time: 0s    memory: 2964 kB     returned value: 1

    ====== DelayedSignal :: needed for production purpose ===============
    DelayedSignal INIT - 03 - pointer to method & pointer to class instance (Arg num: 1)
    DelayedSignal INIT - 04 - pointer to method & pointer to class instance & arguments (Arg num: 1)
    DelayedSignal INIT - 03 - pointer to method & pointer to class instance (Arg num: 1)
    DelayedSignal INIT - 04 - pointer to method & pointer to class instance & arguments (Arg num: 1)
    ====== DelayedSignal_DebugHelper :: used only for debug purpose ======
    DelayedSignal_DebugHelper INIT - 03 - pointer to method & pointer to class instance (Arg num: 1)
    DelayedSignal_DebugHelper INIT - 04 - pointer to method & pointer to class instance & arguments (Arg num: 1)
    DelayedSignal_DebugHelper INIT - 03 - pointer to method & pointer to class instance (Arg num: 1)
    DelayedSignal_DebugHelper INIT - 04 - pointer to method & pointer to class instance & arguments (Arg num: 1)
    ~DelayedSignal_DebugHelper CLOSE
    ~DelayedSignal_DebugHelper CLOSE
    ~DelayedSignal_DebugHelper CLOSE
    ~DelayedSignal_DebugHelper CLOSE
    ~DelayedSignal CLOSE
    ~DelayedSignal CLOSE
    ~DelayedSignal CLOSE
    ~DelayedSignal CLOSE