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 | #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); }; 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; } }; #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 ; } |
I2luY2x1ZGUgPHV0aWxpdHk+Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgRiwgdHlwZW5hbWUuLi4gQXJncz4Kc3RydWN0IENhbGxhYmxlCnsKcHJpdmF0ZToKICBzdGF0aWMgaW50IHRlc3RlclsxXTsKICB0eXBlZGVmIGNoYXIgICAgICAgICAgICAgICAgICAgICAgeWVzOwogIHR5cGVkZWYgc3RydWN0IHsgY2hhciBhcnJheVsyXTsgfSBubzsKCiAgdGVtcGxhdGUgPHR5cGVuYW1lIEcsIHR5cGVuYW1lLi4uIEJyZ3M+CiAgc3RhdGljIGNoYXIgc2ZpbmFlKGRlY2x0eXBlKHN0ZDo6ZGVjbHZhbDxHPigpKHN0ZDo6ZGVjbHZhbDxCcmdzPigpLi4uKSkgKEc6OipwZm4pKEJyZ3MuLi4pKSB7IHJldHVybiAwOyB9CgogIHRlbXBsYXRlIDx0eXBlbmFtZSBHLCB0eXBlbmFtZS4uLiBCcmdzPgogIHN0YXRpYyBjaGFyIHNmaW5hZShkZWNsdHlwZShzdGQ6OmRlY2x2YWw8Rz4oKShzdGQ6OmRlY2x2YWw8QnJncz4oKS4uLikpIChHOjoqcGZuKShCcmdzLi4uKSBjb25zdCkgeyByZXR1cm4gMDsgfQoKICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRywgdHlwZW5hbWUuLi4gQnJncz4KICBzdGF0aWMgeWVzIHRlc3QoaW50ICgmYSlbc2l6ZW9mKHNmaW5hZTxHLEJyZ3MuLi4+KCZHOjpvcGVyYXRvcigpKSldKTsKCiAgdGVtcGxhdGUgPHR5cGVuYW1lIEcsIHR5cGVuYW1lLi4uIEJyZ3M+CiAgc3RhdGljIG5vIHRlc3QoLi4uKTsKCnB1YmxpYzoKICBzdGF0aWMgYm9vbCBjb25zdCB2YWx1ZSA9IHNpemVvZih0ZXN0PEYsIEFyZ3MuLi4+KHRlc3RlcikpID09IHNpemVvZih5ZXMpOwp9OwoKc3RydWN0IEZvbwp7CiAgaW50IG9wZXJhdG9yKCkoaW50ICYpIHsgcmV0dXJuIDE7IH0KCn07CgpzdHJ1Y3QgQmFyCnsKICBpbnQgb3BlcmF0b3IoKShpbnQgY29uc3QgJikgeyByZXR1cm4gMjsgfQp9OwoKc3RydWN0IFdhenoKewogIGludCBvcGVyYXRvcigpKGludCBjb25zdCAmKSBjb25zdCB7IHJldHVybiAzOyB9Cn07CgpzdHJ1Y3QgRnJvYgp7CiAgaW50IG9wZXJhdG9yKCkoaW50ICYpIHsgcmV0dXJuIDQ7IH0KICBpbnQgb3BlcmF0b3IoKShpbnQgY29uc3QgJikgY29uc3QgeyByZXR1cm4gNTsgfQp9OwoKc3RydWN0IEJsaXAKewogIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiAgaW50IG9wZXJhdG9yKCkoVCkgeyByZXR1cm4gNjsgfQp9OwoKc3RydWN0IEJvb20KewogIGludCBvcGVyYXRvcigpKGNvbnN0IGludCAmKSB7IHJldHVybiAyOyB9CiAgaW50IG9wZXJhdG9yKCkoZmxvYXQgeCkgeyByZXR1cm4gMDt9Cn07CgpzdHJ1Y3QgWmFwCnsKICBpbnQgb3BlcmF0b3IoKShpbnQpIHsgcmV0dXJuIDQyOyB9Cn07CgojaW5jbHVkZSA8aW9zdHJlYW0+CmludCBtYWluKCkKewogIHN0ZDo6Y291dCA8PCAiRm9vKGNvbnN0IGludCAmKTogICIgPDwgQ2FsbGFibGU8Rm9vLCAgaW50IGNvbnN0ICY+Ojp2YWx1ZSA8PCBzdGQ6OmVuZGwKICAgICAgICAgICAgPDwgIkZvbyhpbnQgJik6ICAgICAgICAiIDw8IENhbGxhYmxlPEZvbywgIGludCAmPjo6dmFsdWUgPDwgc3RkOjplbmRsCiAgICAgICAgICAgIDw8ICJCYXIoY29uc3QgaW50ICYpOiAgIiA8PCBDYWxsYWJsZTxCYXIsICBjb25zdCBpbnQgJj46OnZhbHVlIDw8IHN0ZDo6ZW5kbAogICAgICAgICAgICA8PCAiQmFyKGludCAmKTogICAgICAgICIgPDwgQ2FsbGFibGU8QmFyLCAgaW50ICY+Ojp2YWx1ZSA8PCBzdGQ6OmVuZGwKICAgICAgICAgICAgPDwgIlphcChjb25zdCBpbnQgJik6ICAiIDw8IENhbGxhYmxlPFphcCAsIGNvbnN0IGludCAmPjo6dmFsdWUgPDwgc3RkOjplbmRsCiAgICAgICAgICAgIDw8ICJaYXAoaW50Jik6ICAgICAgICAgIiA8PCBDYWxsYWJsZTxaYXAgLCBpbnQgJj46OnZhbHVlIDw8IHN0ZDo6ZW5kbAogICAgICAgICAgICA8PCAiV2F6eihjb25zdCBpbnQgJik6ICIgPDwgQ2FsbGFibGU8V2F6eiwgY29uc3QgaW50ICY+Ojp2YWx1ZSA8PCBzdGQ6OmVuZGwKICAgICAgICAgICAgPDwgIldhenooaW50ICYpOiAgICAgICAiIDw8IENhbGxhYmxlPFdhenosIGludCAmPjo6dmFsdWUgPDwgc3RkOjplbmRsCiAgICAgICAgICAgIDw8ICJGcm9iKGNvbnN0IGludCAmKTogIiA8PCBDYWxsYWJsZTxGcm9iLCBjb25zdCBpbnQgJj46OnZhbHVlIDw8IHN0ZDo6ZW5kbAogICAgICAgICAgICA8PCAiRnJvYihpbnQgJik6ICAgICAgICIgPDwgQ2FsbGFibGU8RnJvYiwgaW50ICY+Ojp2YWx1ZSA8PCBzdGQ6OmVuZGwKICAgICAgICAgICAgPDwgIkJsaXAoY29uc3QgaW50ICYpOiAiIDw8IENhbGxhYmxlPEJsaXAsIGNvbnN0IGludCAmPjo6dmFsdWUgPDwgc3RkOjplbmRsCiAgICAgICAgICAgIDw8ICJCbGlwKGludCAmKTogICAgICAgIiA8PCBDYWxsYWJsZTxCbGlwLCBpbnQgJj46OnZhbHVlIDw8IHN0ZDo6ZW5kbAogICAgICAgICAgICA8PCAiQm9vbShjb25zdCBpbnQgJik6ICIgPDwgQ2FsbGFibGU8Qm9vbSwgY29uc3QgaW50ICY+Ojp2YWx1ZSA8PCBzdGQ6OmVuZGwKICAgICAgICAgICAgPDwgIkJvb20oaW50Jik6ICAgICAgICAiIDw8IENhbGxhYmxlPEJvb20sIGludCAmPjo6dmFsdWUgPDwgc3RkOjplbmRsCiAgICA7Cn0=
-
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


