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 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | #include <utility> #include <type_traits> template <typename F, typename... Args> class Callable{ static int tester[1]; typedef char yes; typedef yes (&no)[2]; template <typename G, typename... Brgs, typename C> static typename std::enable_if<!std::is_same<G,C>::value, char>::type sfinae(decltype(std::declval<G>()(std::declval<Brgs>()...)) (C::*pfn)(Brgs...)); template <typename G, typename... Brgs, typename C> static typename std::enable_if<!std::is_same<G,C>::value, char>::type sfinae(decltype(std::declval<G>()(std::declval<Brgs>()...)) (C::*pfn)(Brgs...) const); template <typename G, typename... Brgs> static char sfinae(decltype(std::declval<G>()(std::declval<Brgs>()...)) (G::*pfn)(Brgs...)); template <typename G, typename... Brgs> static char sfinae(decltype(std::declval<G>()(std::declval<Brgs>()...)) (G::*pfn)(Brgs...) const); template <typename G, typename... Brgs> static yes test(int (&a)[sizeof(sfinae<G,Brgs...>(&G::operator()))]); template <typename G, typename... Brgs> static no test(...); public: static bool const value = sizeof(test<F, Args...>(tester)) == sizeof(yes); }; template<class R, class... Args> struct Helper{ R operator()(Args...); }; template<typename R, typename... FArgs, typename... Args> class Callable<R(*)(FArgs...), Args...> : public Callable<Helper<R, FArgs...>, Args...>{}; struct Foo{ int operator()(int &) { return 1; } }; struct Bar{ int operator()(int const &) { return 2; } }; struct Frob{ int operator()(int &) { return 4; } int operator()(int const &) const { return 5; } }; struct Blip{ template<typename T> int operator()(T) { return 6; } }; struct Boom{ int operator()(const int &) { return 2; } int operator()(float x) { return 0;} }; struct Zap{ int operator()(int) { return 42; } }; typedef int (*Zip)(int const&); typedef int (*Zup)(float); struct Ping{ int operator()(int const&, char=0){ return 42; } }; struct Inh : Bar{}; #include <iostream> template<class T> void test(int ref, int cref){ static bool const ref_val = Callable<T, int&>::value; static bool const cref_val = Callable<T, int const&>::value; std::cout << "\t(int&) test - expected: " << ref << " - got: " << ref_val << '\n' << "\t(int const&) test - expected: " << cref << " - got: " << cref_val << '\n'; if(ref == ref_val && cref == cref_val) std::cout << "passed\n"; else std::cout << "FAILED\n"; } int main() { std::cout << "Foo - no overload - 'int&' parameter:\n"; test<Foo>(1, 0); std::cout << "Bar - no overload - 'int const&' parameter:\n"; test<Bar>(0, 1); std::cout << "Zap - no overload - 'int' parameter:\n"; test<Zap>(0, 0); std::cout << "Frob - overloaded - 'int&' and 'int const&' parameter:\n"; test<Frob>(1, 1); std::cout << "Boom - overloaded - 'int const&' and 'float' parameter:\n"; test<Boom>(0, 1); std::cout << "Blip - templated - 'T' parameter:\n"; test<Blip>(1, 1); std::cout << "Zip - function pointer - 'int const&' parameter:\n"; test<Zip>(0, 1); std::cout << "Zup - function pointer - 'float' parameter:\n"; test<Zup>(0, 0); std::cout << "Ping - no overload - 'int const&' and 'char=0' parameter:\n"; test<Ping>(0, 1); std::cout << "Inh - no overload, inherited - 'int const&' parameter:\n"; test<Inh>(0, 1); } |
I2luY2x1ZGUgPHV0aWxpdHk+CiNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KCnRlbXBsYXRlIDx0eXBlbmFtZSBGLCB0eXBlbmFtZS4uLiBBcmdzPgpjbGFzcyBDYWxsYWJsZXsKICBzdGF0aWMgaW50IHRlc3RlclsxXTsKICB0eXBlZGVmIGNoYXIgeWVzOwogIHR5cGVkZWYgeWVzICgmbm8pWzJdOwoKICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRywgdHlwZW5hbWUuLi4gQnJncywgdHlwZW5hbWUgQz4KICBzdGF0aWMgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8IXN0ZDo6aXNfc2FtZTxHLEM+Ojp2YWx1ZSwgY2hhcj46OnR5cGUKICAgICAgc2ZpbmFlKGRlY2x0eXBlKHN0ZDo6ZGVjbHZhbDxHPigpKHN0ZDo6ZGVjbHZhbDxCcmdzPigpLi4uKSkgKEM6OipwZm4pKEJyZ3MuLi4pKTsKCiAgdGVtcGxhdGUgPHR5cGVuYW1lIEcsIHR5cGVuYW1lLi4uIEJyZ3MsIHR5cGVuYW1lIEM+CiAgc3RhdGljIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCFzdGQ6OmlzX3NhbWU8RyxDPjo6dmFsdWUsIGNoYXI+Ojp0eXBlCiAgICAgIHNmaW5hZShkZWNsdHlwZShzdGQ6OmRlY2x2YWw8Rz4oKShzdGQ6OmRlY2x2YWw8QnJncz4oKS4uLikpIChDOjoqcGZuKShCcmdzLi4uKSBjb25zdCk7CgogIHRlbXBsYXRlIDx0eXBlbmFtZSBHLCB0eXBlbmFtZS4uLiBCcmdzPgogIHN0YXRpYyBjaGFyIHNmaW5hZShkZWNsdHlwZShzdGQ6OmRlY2x2YWw8Rz4oKShzdGQ6OmRlY2x2YWw8QnJncz4oKS4uLikpIChHOjoqcGZuKShCcmdzLi4uKSk7CgogIHRlbXBsYXRlIDx0eXBlbmFtZSBHLCB0eXBlbmFtZS4uLiBCcmdzPgogIHN0YXRpYyBjaGFyIHNmaW5hZShkZWNsdHlwZShzdGQ6OmRlY2x2YWw8Rz4oKShzdGQ6OmRlY2x2YWw8QnJncz4oKS4uLikpIChHOjoqcGZuKShCcmdzLi4uKSBjb25zdCk7CgogIHRlbXBsYXRlIDx0eXBlbmFtZSBHLCB0eXBlbmFtZS4uLiBCcmdzPgogIHN0YXRpYyB5ZXMgdGVzdChpbnQgKCZhKVtzaXplb2Yoc2ZpbmFlPEcsQnJncy4uLj4oJkc6Om9wZXJhdG9yKCkpKV0pOwoKICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRywgdHlwZW5hbWUuLi4gQnJncz4KICBzdGF0aWMgbm8gdGVzdCguLi4pOwoKcHVibGljOgogIHN0YXRpYyBib29sIGNvbnN0IHZhbHVlID0gc2l6ZW9mKHRlc3Q8RiwgQXJncy4uLj4odGVzdGVyKSkgPT0gc2l6ZW9mKHllcyk7Cn07Cgp0ZW1wbGF0ZTxjbGFzcyBSLCBjbGFzcy4uLiBBcmdzPgpzdHJ1Y3QgSGVscGVyeyBSIG9wZXJhdG9yKCkoQXJncy4uLik7IH07CiAKdGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUuLi4gRkFyZ3MsIHR5cGVuYW1lLi4uIEFyZ3M+CmNsYXNzIENhbGxhYmxlPFIoKikoRkFyZ3MuLi4pLCBBcmdzLi4uPgogIDogcHVibGljIENhbGxhYmxlPEhlbHBlcjxSLCBGQXJncy4uLj4sIEFyZ3MuLi4+e307CgpzdHJ1Y3QgRm9vewogIGludCBvcGVyYXRvcigpKGludCAmKSB7IHJldHVybiAxOyB9Cn07CgpzdHJ1Y3QgQmFyewogIGludCBvcGVyYXRvcigpKGludCBjb25zdCAmKSB7IHJldHVybiAyOyB9Cn07CgpzdHJ1Y3QgRnJvYnsKICBpbnQgb3BlcmF0b3IoKShpbnQgJikgeyByZXR1cm4gNDsgfQogIGludCBvcGVyYXRvcigpKGludCBjb25zdCAmKSBjb25zdCB7IHJldHVybiA1OyB9Cn07CgpzdHJ1Y3QgQmxpcHsKICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogIGludCBvcGVyYXRvcigpKFQpIHsgcmV0dXJuIDY7IH0KfTsKCnN0cnVjdCBCb29tewogIGludCBvcGVyYXRvcigpKGNvbnN0IGludCAmKSB7IHJldHVybiAyOyB9CiAgaW50IG9wZXJhdG9yKCkoZmxvYXQgeCkgeyByZXR1cm4gMDt9Cn07CgpzdHJ1Y3QgWmFwewogIGludCBvcGVyYXRvcigpKGludCkgeyByZXR1cm4gNDI7IH0KfTsKCnR5cGVkZWYgaW50ICgqWmlwKShpbnQgY29uc3QmKTsKdHlwZWRlZiBpbnQgKCpadXApKGZsb2F0KTsKCnN0cnVjdCBQaW5newogIGludCBvcGVyYXRvcigpKGludCBjb25zdCYsIGNoYXI9MCl7IHJldHVybiA0MjsgfQp9OwoKc3RydWN0IEluaCA6IEJhcnt9OwoKCiNpbmNsdWRlIDxpb3N0cmVhbT4KCnRlbXBsYXRlPGNsYXNzIFQ+CnZvaWQgdGVzdChpbnQgcmVmLCBpbnQgY3JlZil7CiAgc3RhdGljIGJvb2wgY29uc3QgcmVmX3ZhbCA9IENhbGxhYmxlPFQsIGludCY+Ojp2YWx1ZTsKICBzdGF0aWMgYm9vbCBjb25zdCBjcmVmX3ZhbCA9IENhbGxhYmxlPFQsIGludCBjb25zdCY+Ojp2YWx1ZTsKICBzdGQ6OmNvdXQgPDwgIlx0KGludCYpIHRlc3QgLSBleHBlY3RlZDogIiA8PCByZWYgPDwgIiAtIGdvdDogIgogICAgICAgICAgICAgIDw8IHJlZl92YWwgPDwgJ1xuJwogICAgICAgICAgICA8PCAiXHQoaW50IGNvbnN0JikgdGVzdCAtIGV4cGVjdGVkOiAiIDw8IGNyZWYgPDwgIiAtIGdvdDogIgogICAgICAgICAgICAgIDw8IGNyZWZfdmFsIDw8ICdcbic7CiAgaWYocmVmID09IHJlZl92YWwgJiYgY3JlZiA9PSBjcmVmX3ZhbCkKICAgIHN0ZDo6Y291dCA8PCAicGFzc2VkXG4iOwogIGVsc2UKICAgIHN0ZDo6Y291dCA8PCAiRkFJTEVEXG4iOwp9CgppbnQgbWFpbigpCnsKICBzdGQ6OmNvdXQgPDwgIkZvbyAtIG5vIG92ZXJsb2FkIC0gJ2ludCYnIHBhcmFtZXRlcjpcbiI7CiAgICAgICAgICAgIHRlc3Q8Rm9vPigxLCAwKTsKICBzdGQ6OmNvdXQgPDwgIkJhciAtIG5vIG92ZXJsb2FkIC0gJ2ludCBjb25zdCYnIHBhcmFtZXRlcjpcbiI7CiAgICAgICAgICAgIHRlc3Q8QmFyPigwLCAxKTsKICBzdGQ6OmNvdXQgPDwgIlphcCAtIG5vIG92ZXJsb2FkIC0gJ2ludCcgcGFyYW1ldGVyOlxuIjsKICAgICAgICAgICAgdGVzdDxaYXA+KDAsIDApOwogIHN0ZDo6Y291dCA8PCAiRnJvYiAtIG92ZXJsb2FkZWQgLSAnaW50JicgYW5kICdpbnQgY29uc3QmJyBwYXJhbWV0ZXI6XG4iOwogICAgICAgICAgICB0ZXN0PEZyb2I+KDEsIDEpOwogIHN0ZDo6Y291dCA8PCAiQm9vbSAtIG92ZXJsb2FkZWQgLSAnaW50IGNvbnN0JicgYW5kICdmbG9hdCcgcGFyYW1ldGVyOlxuIjsKICAgICAgICAgICAgdGVzdDxCb29tPigwLCAxKTsKICBzdGQ6OmNvdXQgPDwgIkJsaXAgLSB0ZW1wbGF0ZWQgLSAnVCcgcGFyYW1ldGVyOlxuIjsKICAgICAgICAgICAgdGVzdDxCbGlwPigxLCAxKTsKICBzdGQ6OmNvdXQgPDwgIlppcCAtIGZ1bmN0aW9uIHBvaW50ZXIgLSAnaW50IGNvbnN0JicgcGFyYW1ldGVyOlxuIjsKICAgICAgICAgICAgdGVzdDxaaXA+KDAsIDEpOwogIHN0ZDo6Y291dCA8PCAiWnVwIC0gZnVuY3Rpb24gcG9pbnRlciAtICdmbG9hdCcgcGFyYW1ldGVyOlxuIjsKICAgICAgICAgICAgdGVzdDxadXA+KDAsIDApOwogIHN0ZDo6Y291dCA8PCAiUGluZyAtIG5vIG92ZXJsb2FkIC0gJ2ludCBjb25zdCYnIGFuZCAnY2hhcj0wJyBwYXJhbWV0ZXI6XG4iOwogICAgICAgICAgICB0ZXN0PFBpbmc+KDAsIDEpOwogIHN0ZDo6Y291dCA8PCAiSW5oIC0gbm8gb3ZlcmxvYWQsIGluaGVyaXRlZCAtICdpbnQgY29uc3QmJyBwYXJhbWV0ZXI6XG4iOwogICAgICAgICAgICB0ZXN0PEluaD4oMCwgMSk7Cn0=
-
upload with new input
-
result: Success time: 0s memory: 2832 kB returned value: 0
Foo - no overload - 'int&' parameter: (int&) test - expected: 1 - got: 1 (int const&) test - expected: 0 - got: 0 passed Bar - no overload - 'int const&' parameter: (int&) test - expected: 0 - got: 0 (int const&) test - expected: 1 - got: 1 passed Zap - no overload - 'int' parameter: (int&) test - expected: 0 - got: 0 (int const&) test - expected: 0 - got: 0 passed Frob - overloaded - 'int&' and 'int const&' parameter: (int&) test - expected: 1 - got: 0 (int const&) test - expected: 1 - got: 0 FAILED Boom - overloaded - 'int const&' and 'float' parameter: (int&) test - expected: 0 - got: 0 (int const&) test - expected: 1 - got: 0 FAILED Blip - templated - 'T' parameter: (int&) test - expected: 1 - got: 1 (int const&) test - expected: 1 - got: 1 passed Zip - function pointer - 'int const&' parameter: (int&) test - expected: 0 - got: 0 (int const&) test - expected: 1 - got: 1 passed Zup - function pointer - 'float' parameter: (int&) test - expected: 0 - got: 0 (int const&) test - expected: 0 - got: 0 passed Ping - no overload - 'int const&' and 'char=0' parameter: (int&) test - expected: 0 - got: 0 (int const&) test - expected: 1 - got: 1 passed Inh - no overload, inherited - 'int const&' parameter: (int&) test - expected: 0 - got: 0 (int const&) test - expected: 1 - got: 1 passed


