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; } |
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGU8IGNsYXNzIFQgPiBzdHJ1Y3QgaWRlbnRpdHkgeyB0eXBlZGVmIFQgdHlwZTsgfTsKCnN0cnVjdCBEZWxheWVkU2lnbmFsCnsgICAKICAgIH5EZWxheWVkU2lnbmFsICgpCiAgICB7IHN0ZDo6Y291dCA8PCAifkRlbGF5ZWRTaWduYWwgQ0xPU0UiIDw8IHN0ZDo6ZW5kbDsgfQoKICAgIHRlbXBsYXRlPGNsYXNzIEMsIGNsYXNzLi4uIEFyZ3M+CiAgICBEZWxheWVkU2lnbmFsICggdm9pZChDOjoqZnVuYykoQXJncy4uLiksIEMmIG9iaiApCiAgICB7IHN0ZDo6Y291dCA8PCAiRGVsYXllZFNpZ25hbCBJTklUIC0gMDMgLSBwb2ludGVyIHRvIG1ldGhvZCAmIHBvaW50ZXIgdG8gY2xhc3MgaW5zdGFuY2UgKEFyZyBudW06ICIgPDwgc2l6ZW9mLi4uKEFyZ3MpIDw8ICIpIiA8PCBzdGQ6OmVuZGw7IH0KCiAgICB0ZW1wbGF0ZTxjbGFzcyBDLCBjbGFzcy4uLiBBcmdzPgogICAgRGVsYXllZFNpZ25hbCAoIHZvaWQoQzo6KmZ1bmMpKEFyZ3MuLi4pLCBDJiBvYmosIHR5cGVuYW1lIGlkZW50aXR5PEFyZ3M+Ojp0eXBlLi4uIGFyZ3MgKQogICAgewogICAgICAgIHN0ZDo6Y291dCA8PCAiRGVsYXllZFNpZ25hbCBJTklUIC0gMDQgLSBwb2ludGVyIHRvIG1ldGhvZCAmIHBvaW50ZXIgdG8gY2xhc3MgaW5zdGFuY2UgJiBhcmd1bWVudHMgKEFyZyBudW06ICIgPDwgc2l6ZW9mLi4uKEFyZ3MpIDw8ICIpIiA8PCBzdGQ6OmVuZGw7CiAgICB9Cn07Cgp0ZW1wbGF0ZTxjbGFzcy4uLiBBcmdzQmlzPgpzdHJ1Y3QgRGVsYXllZFNpZ25hbF9EZWJ1Z0hlbHBlciAKewogICAgfkRlbGF5ZWRTaWduYWxfRGVidWdIZWxwZXIgKCkKICAgIHsgc3RkOjpjb3V0IDw8ICJ+RGVsYXllZFNpZ25hbF9EZWJ1Z0hlbHBlciBDTE9TRSIgPDwgc3RkOjplbmRsOyB9CgogICAgdGVtcGxhdGU8Y2xhc3MgQywgY2xhc3MuLi4gQXJncz4KICAgIERlbGF5ZWRTaWduYWxfRGVidWdIZWxwZXIgKCB2b2lkKEM6OipmdW5jKShBcmdzLi4uKSwgQyYgb2JqICkKICAgIHsgc3RkOjpjb3V0IDw8ICJEZWxheWVkU2lnbmFsX0RlYnVnSGVscGVyIElOSVQgLSAwMyAtIHBvaW50ZXIgdG8gbWV0aG9kICYgcG9pbnRlciB0byBjbGFzcyBpbnN0YW5jZSAoQXJnIG51bTogIiA8PCBzaXplb2YuLi4oQXJncykgPDwgIikiIDw8IHN0ZDo6ZW5kbDsgfQoKICAgIHRlbXBsYXRlPGNsYXNzIEMsIGNsYXNzLi4uIEFyZ3M+CiAgICBEZWxheWVkU2lnbmFsX0RlYnVnSGVscGVyICggdm9pZChDOjoqZnVuYykoQXJncy4uLiksIEMmIG9iaiwgQXJnc0Jpcy4uLiBhcmdzICkgLy8gTmVlZCB0byB1c2UgQXJnc0JpcyBpbnN0ZWFkIG9mIEFyZ3MgdG8gbWFrZSBpdCB3b3JrCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJEZWxheWVkU2lnbmFsX0RlYnVnSGVscGVyIElOSVQgLSAwNCAtIHBvaW50ZXIgdG8gbWV0aG9kICYgcG9pbnRlciB0byBjbGFzcyBpbnN0YW5jZSAmIGFyZ3VtZW50cyAoQXJnIG51bTogIiA8PCBzaXplb2YuLi4oQXJncykgPDwgIikiIDw8IHN0ZDo6ZW5kbDsKICAgIH0KfTsKCgp0ZW1wbGF0ZSA8IGNsYXNzIFRyLCBjbGFzcy4uLiBBcmdzID4Kc3RydWN0IFNpZ25hbAp7CiAgICB2b2lkIGZpcmUgKCBBcmdzLi4uIGFyZ3MgKSB7IHN0ZDo6Y291dCA8PCAiU2lnbmFsOjpmaXJlOjoiIDw8IHNpemVvZi4uLihBcmdzKSA8PCBzdGQ6OmVuZGw7IH0KfTsKCnN0cnVjdCBLbGFzcyB7fTsKCgppbnQgbWFpbigpCnsKICAgIHN0ZDo6c3RyaW5nIHN0cjEoIkJsb3AiKTsgICAvLyBXaWxsIGJlIHVzZWQgYXMgcmVmZXJlbmNlCiAgICBLbGFzcyBrOyAgICAgICAgICAgICAgICAgICAgLy8gV2lsbCBiZSB1c2VkIGFzIHJlZmVyZW5jZQoKICAgIFNpZ25hbDx2b2lkLCBLbGFzcyY+IHNpZ25hbF8wMTsKICAgIFNpZ25hbDx2b2lkLCBzdGQ6OnN0cmluZyY+IHNpZ25hbF8wMjsKCiAgICBzdGQ6OmNvdXQgPDwgIj09PT09PSBEZWxheWVkU2lnbmFsIDo6IG5lZWRlZCBmb3IgcHJvZHVjdGlvbiBwdXJwb3NlID09PT09PT09PT09PT09PSIgPDwgc3RkOjplbmRsOwoKICAgIC8vIE9LCiAgICBEZWxheWVkU2lnbmFsIHRlc3QwMSgmU2lnbmFsPHZvaWQsIHN0ZDo6c3RyaW5nJj46OmZpcmUsIHNpZ25hbF8wMik7CiAgICAvLyBIRVJFIElTIFRIRSBQUk9CTEVNCiAgICBEZWxheWVkU2lnbmFsIHRlc3QwMigmU2lnbmFsPHZvaWQsIHN0ZDo6c3RyaW5nJj46OmZpcmUsIHNpZ25hbF8wMiwgc3RyMSk7CgogICAgLy8gT0sKICAgIERlbGF5ZWRTaWduYWwgdGVzdDAzKCZTaWduYWw8dm9pZCwgS2xhc3MmPjo6ZmlyZSwgc2lnbmFsXzAxKTsKICAgIC8vIEhFUkUgSVMgVEhFIFBST0JMRU0KICAgIERlbGF5ZWRTaWduYWwgdGVzdDA0KCZTaWduYWw8dm9pZCwgS2xhc3MmPjo6ZmlyZSwgc2lnbmFsXzAxLCBrKTsKCiAgICBzdGQ6OmNvdXQgPDwgIj09PT09PSBEZWxheWVkU2lnbmFsX0RlYnVnSGVscGVyIDo6IHVzZWQgb25seSBmb3IgZGVidWcgcHVycG9zZSA9PT09PT0iIDw8IHN0ZDo6ZW5kbDsKCiAgICAvLyBPSwogICAgRGVsYXllZFNpZ25hbF9EZWJ1Z0hlbHBlcjxzdGQ6OnN0cmluZyY+IHRlc3QwNSgmU2lnbmFsPHZvaWQsIHN0ZDo6c3RyaW5nJj46OmZpcmUsIHNpZ25hbF8wMik7CiAgICAvLyBPSwogICAgRGVsYXllZFNpZ25hbF9EZWJ1Z0hlbHBlcjxzdGQ6OnN0cmluZyY+IHRlc3QwNigmU2lnbmFsPHZvaWQsIHN0ZDo6c3RyaW5nJj46OmZpcmUsIHNpZ25hbF8wMiwgc3RyMSk7CgogICAgLy8gT0sKICAgIERlbGF5ZWRTaWduYWxfRGVidWdIZWxwZXI8S2xhc3MmPiB0ZXN0MDcoJlNpZ25hbDx2b2lkLCBLbGFzcyY+OjpmaXJlLCBzaWduYWxfMDEpOwogICAgLy8gT0sKICAgIERlbGF5ZWRTaWduYWxfRGVidWdIZWxwZXI8S2xhc3MmPiB0ZXN0MDgoJlNpZ25hbDx2b2lkLCBLbGFzcyY+OjpmaXJlLCBzaWduYWxfMDEsIGspOwoKICAgIHJldHVybiAxOwp9Cg==
-
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


