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 | #include <utility> template <typename F, typename... Args> struct Callable { private: static int tester[1]; typedef char yes; typedef struct { char array[2]; } no; template <typename G, typename... Brgs> static char sfinae(decltype(std::declval<G>()(std::declval<Brgs>()...)) (G::*pfn)(Brgs...)) { return 0; } template <typename G, typename... Brgs> static char sfinae(decltype(std::declval<G>()(std::declval<Brgs>()...)) (G::*pfn)(Brgs...) const) { return 0; } 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...) const; }; template<typename R, typename... FArgs, typename... Args> struct 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 Wazz { int operator()(int const &) const { return 3; } }; 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); #include <iostream> int main() { std::cout << "Foo(const int &): " << Callable<Foo, int const &>::value << std::endl << "Foo(int &): " << Callable<Foo, int &>::value << std::endl << "Bar(const int &): " << Callable<Bar, const int &>::value << std::endl << "Bar(int &): " << Callable<Bar, int &>::value << std::endl << "Zap(const int &): " << Callable<Zap, const int &>::value << std::endl << "Zap(int&): " << Callable<Zap, int &>::value << std::endl << "Wazz(const int &): " << Callable<Wazz, const int &>::value << std::endl << "Wazz(int &): " << Callable<Wazz, int &>::value << std::endl << "Frob(const int &): " << Callable<Frob, const int &>::value << std::endl << "Frob(int &): " << Callable<Frob, int &>::value << std::endl << "Blip(const int &): " << Callable<Blip, const int &>::value << std::endl << "Blip(int &): " << Callable<Blip, int &>::value << std::endl << "Boom(const int &): " << Callable<Boom, const int &>::value << std::endl << "Boom(int&): " << Callable<Boom, int &>::value << std::endl << "Zip(const int &): " << Callable<Zip, const int &>::value << std::endl << "Zup(int&): " << Callable<Zup, int &>::value << std::endl ; } |
I2luY2x1ZGUgPHV0aWxpdHk+Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgRiwgdHlwZW5hbWUuLi4gQXJncz4Kc3RydWN0IENhbGxhYmxlCnsKcHJpdmF0ZToKICBzdGF0aWMgaW50IHRlc3RlclsxXTsKICB0eXBlZGVmIGNoYXIgICAgICAgICAgICAgICAgICAgICAgeWVzOwogIHR5cGVkZWYgc3RydWN0IHsgY2hhciBhcnJheVsyXTsgfSBubzsKCiAgdGVtcGxhdGUgPHR5cGVuYW1lIEcsIHR5cGVuYW1lLi4uIEJyZ3M+CiAgc3RhdGljIGNoYXIgc2ZpbmFlKGRlY2x0eXBlKHN0ZDo6ZGVjbHZhbDxHPigpKHN0ZDo6ZGVjbHZhbDxCcmdzPigpLi4uKSkgKEc6OipwZm4pKEJyZ3MuLi4pKSB7IHJldHVybiAwOyB9CgogIHRlbXBsYXRlIDx0eXBlbmFtZSBHLCB0eXBlbmFtZS4uLiBCcmdzPgogIHN0YXRpYyBjaGFyIHNmaW5hZShkZWNsdHlwZShzdGQ6OmRlY2x2YWw8Rz4oKShzdGQ6OmRlY2x2YWw8QnJncz4oKS4uLikpIChHOjoqcGZuKShCcmdzLi4uKSBjb25zdCkgeyByZXR1cm4gMDsgfQoKICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRywgdHlwZW5hbWUuLi4gQnJncz4KICBzdGF0aWMgeWVzIHRlc3QoaW50ICgmYSlbc2l6ZW9mKHNmaW5hZTxHLEJyZ3MuLi4+KCZHOjpvcGVyYXRvcigpKSldKTsKCiAgdGVtcGxhdGUgPHR5cGVuYW1lIEcsIHR5cGVuYW1lLi4uIEJyZ3M+CiAgc3RhdGljIG5vIHRlc3QoLi4uKTsKCnB1YmxpYzoKICBzdGF0aWMgYm9vbCBjb25zdCB2YWx1ZSA9IHNpemVvZih0ZXN0PEYsIEFyZ3MuLi4+KHRlc3RlcikpID09IHNpemVvZih5ZXMpOwp9OwoKdGVtcGxhdGU8Y2xhc3MgUiwgY2xhc3MuLi4gQXJncz4Kc3RydWN0IEhlbHBlcnsKICBSIG9wZXJhdG9yKCkoQXJncy4uLikgY29uc3Q7Cn07Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBSLCB0eXBlbmFtZS4uLiBGQXJncywgdHlwZW5hbWUuLi4gQXJncz4Kc3RydWN0IENhbGxhYmxlPFIoKikoRkFyZ3MuLi4pLCBBcmdzLi4uPgogIDogcHVibGljIENhbGxhYmxlPEhlbHBlcjxSLCBGQXJncy4uLj4sIEFyZ3MuLi4+CnsKfTsKCnN0cnVjdCBGb28KewogIGludCBvcGVyYXRvcigpKGludCAmKSB7IHJldHVybiAxOyB9Cgp9OwoKc3RydWN0IEJhcgp7CiAgaW50IG9wZXJhdG9yKCkoaW50IGNvbnN0ICYpIHsgcmV0dXJuIDI7IH0KfTsKCnN0cnVjdCBXYXp6CnsKICBpbnQgb3BlcmF0b3IoKShpbnQgY29uc3QgJikgY29uc3QgeyByZXR1cm4gMzsgfQp9OwoKc3RydWN0IEZyb2IKewogIGludCBvcGVyYXRvcigpKGludCAmKSB7IHJldHVybiA0OyB9CiAgaW50IG9wZXJhdG9yKCkoaW50IGNvbnN0ICYpIGNvbnN0IHsgcmV0dXJuIDU7IH0KfTsKCnN0cnVjdCBCbGlwCnsKICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogIGludCBvcGVyYXRvcigpKFQpIHsgcmV0dXJuIDY7IH0KfTsKCnN0cnVjdCBCb29tCnsKICBpbnQgb3BlcmF0b3IoKShjb25zdCBpbnQgJikgeyByZXR1cm4gMjsgfQogIGludCBvcGVyYXRvcigpKGZsb2F0IHgpIHsgcmV0dXJuIDA7fQp9OwoKc3RydWN0IFphcAp7CiAgaW50IG9wZXJhdG9yKCkoaW50KSB7IHJldHVybiA0MjsgfQp9OwoKdHlwZWRlZiBpbnQgKCpaaXApKGludCBjb25zdCYpOwp0eXBlZGVmIGludCAoKlp1cCkoZmxvYXQpOwoKI2luY2x1ZGUgPGlvc3RyZWFtPgppbnQgbWFpbigpCnsKICBzdGQ6OmNvdXQgPDwgIkZvbyhjb25zdCBpbnQgJik6ICAiIDw8IENhbGxhYmxlPEZvbywgIGludCBjb25zdCAmPjo6dmFsdWUgPDwgc3RkOjplbmRsCiAgICAgICAgICAgIDw8ICJGb28oaW50ICYpOiAgICAgICAgIiA8PCBDYWxsYWJsZTxGb28sICBpbnQgJj46OnZhbHVlIDw8IHN0ZDo6ZW5kbAogICAgICAgICAgICA8PCAiQmFyKGNvbnN0IGludCAmKTogICIgPDwgQ2FsbGFibGU8QmFyLCAgY29uc3QgaW50ICY+Ojp2YWx1ZSA8PCBzdGQ6OmVuZGwKICAgICAgICAgICAgPDwgIkJhcihpbnQgJik6ICAgICAgICAiIDw8IENhbGxhYmxlPEJhciwgIGludCAmPjo6dmFsdWUgPDwgc3RkOjplbmRsCiAgICAgICAgICAgIDw8ICJaYXAoY29uc3QgaW50ICYpOiAgIiA8PCBDYWxsYWJsZTxaYXAsICBjb25zdCBpbnQgJj46OnZhbHVlIDw8IHN0ZDo6ZW5kbAogICAgICAgICAgICA8PCAiWmFwKGludCYpOiAgICAgICAgICIgPDwgQ2FsbGFibGU8WmFwLCAgaW50ICY+Ojp2YWx1ZSA8PCBzdGQ6OmVuZGwKICAgICAgICAgICAgPDwgIldhenooY29uc3QgaW50ICYpOiAiIDw8IENhbGxhYmxlPFdhenosIGNvbnN0IGludCAmPjo6dmFsdWUgPDwgc3RkOjplbmRsCiAgICAgICAgICAgIDw8ICJXYXp6KGludCAmKTogICAgICAgIiA8PCBDYWxsYWJsZTxXYXp6LCBpbnQgJj46OnZhbHVlIDw8IHN0ZDo6ZW5kbAogICAgICAgICAgICA8PCAiRnJvYihjb25zdCBpbnQgJik6ICIgPDwgQ2FsbGFibGU8RnJvYiwgY29uc3QgaW50ICY+Ojp2YWx1ZSA8PCBzdGQ6OmVuZGwKICAgICAgICAgICAgPDwgIkZyb2IoaW50ICYpOiAgICAgICAiIDw8IENhbGxhYmxlPEZyb2IsIGludCAmPjo6dmFsdWUgPDwgc3RkOjplbmRsCiAgICAgICAgICAgIDw8ICJCbGlwKGNvbnN0IGludCAmKTogIiA8PCBDYWxsYWJsZTxCbGlwLCBjb25zdCBpbnQgJj46OnZhbHVlIDw8IHN0ZDo6ZW5kbAogICAgICAgICAgICA8PCAiQmxpcChpbnQgJik6ICAgICAgICIgPDwgQ2FsbGFibGU8QmxpcCwgaW50ICY+Ojp2YWx1ZSA8PCBzdGQ6OmVuZGwKICAgICAgICAgICAgPDwgIkJvb20oY29uc3QgaW50ICYpOiAiIDw8IENhbGxhYmxlPEJvb20sIGNvbnN0IGludCAmPjo6dmFsdWUgPDwgc3RkOjplbmRsCiAgICAgICAgICAgIDw8ICJCb29tKGludCYpOiAgICAgICAgIiA8PCBDYWxsYWJsZTxCb29tLCBpbnQgJj46OnZhbHVlIDw8IHN0ZDo6ZW5kbAogICAgICAgICAgICA8PCAiWmlwKGNvbnN0IGludCAmKTogICIgPDwgQ2FsbGFibGU8WmlwLCAgY29uc3QgaW50ICY+Ojp2YWx1ZSA8PCBzdGQ6OmVuZGwKICAgICAgICAgICAgPDwgIlp1cChpbnQmKTogICAgICAgICAiIDw8IENhbGxhYmxlPFp1cCwgIGludCAmPjo6dmFsdWUgPDwgc3RkOjplbmRsCiAgICA7Cn0=
-
upload with new input
-
result: Success time: 0s memory: 2832 kB returned value: 0
Foo(const int &): 0 Foo(int &): 1 Bar(const int &): 1 Bar(int &): 0 Zap(const int &): 0 Zap(int&): 0 Wazz(const int &): 1 Wazz(int &): 0 Frob(const int &): 0 Frob(int &): 0 Blip(const int &): 1 Blip(int &): 1 Boom(const int &): 0 Boom(int&): 0 Zip(const int &): 1 Zup(int&): 0


