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 | #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> 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<Bar>(0, 1); } |
I2luY2x1ZGUgPHV0aWxpdHk+CiNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KCnRlbXBsYXRlIDx0eXBlbmFtZSBGLCB0eXBlbmFtZS4uLiBBcmdzPgpjbGFzcyBDYWxsYWJsZXsKICBzdGF0aWMgaW50IHRlc3RlclsxXTsKICB0eXBlZGVmIGNoYXIgeWVzOwogIHR5cGVkZWYgeWVzICgmbm8pWzJdOwoKICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRywgdHlwZW5hbWUuLi4gQnJncz4KICBzdGF0aWMgY2hhciBzZmluYWUoZGVjbHR5cGUoc3RkOjpkZWNsdmFsPEc+KCkoc3RkOjpkZWNsdmFsPEJyZ3M+KCkuLi4pKSAoRzo6KnBmbikoQnJncy4uLikpOwoKICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRywgdHlwZW5hbWUuLi4gQnJncz4KICBzdGF0aWMgY2hhciBzZmluYWUoZGVjbHR5cGUoc3RkOjpkZWNsdmFsPEc+KCkoc3RkOjpkZWNsdmFsPEJyZ3M+KCkuLi4pKSAoRzo6KnBmbikoQnJncy4uLikgY29uc3QpOwoKICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRywgdHlwZW5hbWUuLi4gQnJncz4KICBzdGF0aWMgeWVzIHRlc3QoaW50ICgmYSlbc2l6ZW9mKHNmaW5hZTxHLEJyZ3MuLi4+KCZHOjpvcGVyYXRvcigpKSldKTsKCiAgdGVtcGxhdGUgPHR5cGVuYW1lIEcsIHR5cGVuYW1lLi4uIEJyZ3M+CiAgc3RhdGljIG5vIHRlc3QoLi4uKTsKCnB1YmxpYzoKICBzdGF0aWMgYm9vbCBjb25zdCB2YWx1ZSA9IHNpemVvZih0ZXN0PEYsIEFyZ3MuLi4+KHRlc3RlcikpID09IHNpemVvZih5ZXMpOwp9OwoKdGVtcGxhdGU8Y2xhc3MgUiwgY2xhc3MuLi4gQXJncz4Kc3RydWN0IEhlbHBlcnsgUiBvcGVyYXRvcigpKEFyZ3MuLi4pOyB9OwogCnRlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lLi4uIEZBcmdzLCB0eXBlbmFtZS4uLiBBcmdzPgpjbGFzcyBDYWxsYWJsZTxSKCopKEZBcmdzLi4uKSwgQXJncy4uLj4KICA6IHB1YmxpYyBDYWxsYWJsZTxIZWxwZXI8UiwgRkFyZ3MuLi4+LCBBcmdzLi4uPnt9OwoKc3RydWN0IEZvb3sKICBpbnQgb3BlcmF0b3IoKShpbnQgJikgeyByZXR1cm4gMTsgfQp9OwoKc3RydWN0IEJhcnsKICBpbnQgb3BlcmF0b3IoKShpbnQgY29uc3QgJikgeyByZXR1cm4gMjsgfQp9OwoKc3RydWN0IEZyb2J7CiAgaW50IG9wZXJhdG9yKCkoaW50ICYpIHsgcmV0dXJuIDQ7IH0KICBpbnQgb3BlcmF0b3IoKShpbnQgY29uc3QgJikgY29uc3QgeyByZXR1cm4gNTsgfQp9OwoKc3RydWN0IEJsaXB7CiAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICBpbnQgb3BlcmF0b3IoKShUKSB7IHJldHVybiA2OyB9Cn07CgpzdHJ1Y3QgQm9vbXsKICBpbnQgb3BlcmF0b3IoKShjb25zdCBpbnQgJikgeyByZXR1cm4gMjsgfQogIGludCBvcGVyYXRvcigpKGZsb2F0IHgpIHsgcmV0dXJuIDA7fQp9OwoKc3RydWN0IFphcHsKICBpbnQgb3BlcmF0b3IoKShpbnQpIHsgcmV0dXJuIDQyOyB9Cn07Cgp0eXBlZGVmIGludCAoKlppcCkoaW50IGNvbnN0Jik7CnR5cGVkZWYgaW50ICgqWnVwKShmbG9hdCk7CgpzdHJ1Y3QgUGluZ3sKICBpbnQgb3BlcmF0b3IoKShpbnQgY29uc3QmLCBjaGFyPTApeyByZXR1cm4gNDI7IH0KfTsKCnN0cnVjdCBJbmggOiBCYXJ7fTsKCgojaW5jbHVkZSA8aW9zdHJlYW0+Cgp0ZW1wbGF0ZTxjbGFzcyBUPgp2b2lkIHRlc3QoaW50IHJlZiwgaW50IGNyZWYpewogIHN0YXRpYyBib29sIGNvbnN0IHJlZl92YWwgPSBDYWxsYWJsZTxULCBpbnQmPjo6dmFsdWU7CiAgc3RhdGljIGJvb2wgY29uc3QgY3JlZl92YWwgPSBDYWxsYWJsZTxULCBpbnQgY29uc3QmPjo6dmFsdWU7CiAgc3RkOjpjb3V0IDw8ICJcdChpbnQmKSB0ZXN0IC0gZXhwZWN0ZWQ6ICIgPDwgcmVmIDw8ICIgLSBnb3Q6ICIKICAgICAgICAgICAgICA8PCByZWZfdmFsIDw8ICdcbicKICAgICAgICAgICAgPDwgIlx0KGludCBjb25zdCYpIHRlc3QgLSBleHBlY3RlZDogIiA8PCBjcmVmIDw8ICIgLSBnb3Q6ICIKICAgICAgICAgICAgICA8PCBjcmVmX3ZhbCA8PCAnXG4nOwogIGlmKHJlZiA9PSByZWZfdmFsICYmIGNyZWYgPT0gY3JlZl92YWwpCiAgICBzdGQ6OmNvdXQgPDwgInBhc3NlZFxuIjsKICBlbHNlCiAgICBzdGQ6OmNvdXQgPDwgIkZBSUxFRFxuIjsKfQoKaW50IG1haW4oKQp7CiAgc3RkOjpjb3V0IDw8ICJGb28gLSBubyBvdmVybG9hZCAtICdpbnQmJyBwYXJhbWV0ZXI6XG4iOwogICAgICAgICAgICB0ZXN0PEZvbz4oMSwgMCk7CiAgc3RkOjpjb3V0IDw8ICJCYXIgLSBubyBvdmVybG9hZCAtICdpbnQgY29uc3QmJyBwYXJhbWV0ZXI6XG4iOwogICAgICAgICAgICB0ZXN0PEJhcj4oMCwgMSk7CiAgc3RkOjpjb3V0IDw8ICJaYXAgLSBubyBvdmVybG9hZCAtICdpbnQnIHBhcmFtZXRlcjpcbiI7CiAgICAgICAgICAgIHRlc3Q8WmFwPigwLCAwKTsKICBzdGQ6OmNvdXQgPDwgIkZyb2IgLSBvdmVybG9hZGVkIC0gJ2ludCYnIGFuZCAnaW50IGNvbnN0JicgcGFyYW1ldGVyOlxuIjsKICAgICAgICAgICAgdGVzdDxGcm9iPigxLCAxKTsKICBzdGQ6OmNvdXQgPDwgIkJvb20gLSBvdmVybG9hZGVkIC0gJ2ludCBjb25zdCYnIGFuZCAnZmxvYXQnIHBhcmFtZXRlcjpcbiI7CiAgICAgICAgICAgIHRlc3Q8Qm9vbT4oMCwgMSk7CiAgc3RkOjpjb3V0IDw8ICJCbGlwIC0gdGVtcGxhdGVkIC0gJ1QnIHBhcmFtZXRlcjpcbiI7CiAgICAgICAgICAgIHRlc3Q8QmxpcD4oMSwgMSk7CiAgc3RkOjpjb3V0IDw8ICJaaXAgLSBmdW5jdGlvbiBwb2ludGVyIC0gJ2ludCBjb25zdCYnIHBhcmFtZXRlcjpcbiI7CiAgICAgICAgICAgIHRlc3Q8WmlwPigwLCAxKTsKICBzdGQ6OmNvdXQgPDwgIlp1cCAtIGZ1bmN0aW9uIHBvaW50ZXIgLSAnZmxvYXQnIHBhcmFtZXRlcjpcbiI7CiAgICAgICAgICAgIHRlc3Q8WnVwPigwLCAwKTsKICBzdGQ6OmNvdXQgPDwgIlBpbmcgLSBubyBvdmVybG9hZCAtICdpbnQgY29uc3QmJyBhbmQgJ2NoYXI9MCcgcGFyYW1ldGVyOlxuIjsKICAgICAgICAgICAgdGVzdDxQaW5nPigwLCAxKTsKICBzdGQ6OmNvdXQgPDwgIkluaCAtIG5vIG92ZXJsb2FkLCBpbmhlcml0ZWQgLSAnaW50IGNvbnN0JicgcGFyYW1ldGVyOlxuIjsKICAgICAgICAgICAgdGVzdDxCYXI+KDAsIDEpOwp9
-
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


