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 | #include <utility> template <typename F, typename Arg> struct Callable { private: static int tester[1]; typedef char yes; typedef struct { char array[2]; } no; template <typename G, typename Brg> static char sfinae(decltype(std::declval<G>()(std::declval<Brg>())) (G::*pfn)(Brg)) { return 0; } template <typename G, typename Brg> static char sfinae(decltype(std::declval<G>()(std::declval<Brg>())) (G::*pfn)(Brg) const) { return 0; } template <typename G, typename Brg> static yes test(int (&a)[sizeof(sfinae<G,Brg>(&G::operator()))]); template <typename G, typename Brg> static no test(...); public: static bool const value = sizeof(test<F, Arg>(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 { }; 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+Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgRiwgdHlwZW5hbWUgQXJnPgpzdHJ1Y3QgQ2FsbGFibGUKewpwcml2YXRlOgogIHN0YXRpYyBpbnQgdGVzdGVyWzFdOwogIHR5cGVkZWYgY2hhciAgICAgICAgICAgICAgICAgICAgICB5ZXM7CiAgdHlwZWRlZiBzdHJ1Y3QgeyBjaGFyIGFycmF5WzJdOyB9IG5vOwoKICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRywgdHlwZW5hbWUgQnJnPgogIHN0YXRpYyBjaGFyIHNmaW5hZShkZWNsdHlwZShzdGQ6OmRlY2x2YWw8Rz4oKShzdGQ6OmRlY2x2YWw8QnJnPigpKSkgKEc6OipwZm4pKEJyZykpIHsgcmV0dXJuIDA7IH0KCiAgdGVtcGxhdGUgPHR5cGVuYW1lIEcsIHR5cGVuYW1lIEJyZz4KICBzdGF0aWMgY2hhciBzZmluYWUoZGVjbHR5cGUoc3RkOjpkZWNsdmFsPEc+KCkoc3RkOjpkZWNsdmFsPEJyZz4oKSkpIChHOjoqcGZuKShCcmcpIGNvbnN0KSB7IHJldHVybiAwOyB9CgogIHRlbXBsYXRlIDx0eXBlbmFtZSBHLCB0eXBlbmFtZSBCcmc+CiAgc3RhdGljIHllcyB0ZXN0KGludCAoJmEpW3NpemVvZihzZmluYWU8RyxCcmc+KCZHOjpvcGVyYXRvcigpKSldKTsKCiAgdGVtcGxhdGUgPHR5cGVuYW1lIEcsIHR5cGVuYW1lIEJyZz4KICBzdGF0aWMgbm8gdGVzdCguLi4pOwoKcHVibGljOgogIHN0YXRpYyBib29sIGNvbnN0IHZhbHVlID0gc2l6ZW9mKHRlc3Q8RiwgQXJnPih0ZXN0ZXIpKSA9PSBzaXplb2YoeWVzKTsKfTsKCnN0cnVjdCBGb28KewogIGludCBvcGVyYXRvcigpKGludCAmKSB7IHJldHVybiAxOyB9Cgp9OwoKc3RydWN0IEJhcgp7CiAgaW50IG9wZXJhdG9yKCkoaW50IGNvbnN0ICYpIHsgcmV0dXJuIDI7IH0KfTsKCnN0cnVjdCBXYXp6CnsKICBpbnQgb3BlcmF0b3IoKShpbnQgY29uc3QgJikgY29uc3QgeyByZXR1cm4gMzsgfQp9OwoKc3RydWN0IEZyb2IKewogIGludCBvcGVyYXRvcigpKGludCAmKSB7IHJldHVybiA0OyB9CiAgaW50IG9wZXJhdG9yKCkoaW50IGNvbnN0ICYpIGNvbnN0IHsgcmV0dXJuIDU7IH0KfTsKCnN0cnVjdCBCbGlwCnsKICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogIGludCBvcGVyYXRvcigpKFQpIHsgcmV0dXJuIDY7IH0KfTsKCnN0cnVjdCBCb29tCnsKCn07CgpzdHJ1Y3QgWmFwCnsKICBpbnQgb3BlcmF0b3IoKShpbnQpIHsgcmV0dXJuIDQyOyB9Cn07CgojaW5jbHVkZSA8aW9zdHJlYW0+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 &): 1 Frob(int &): 1 Blip(const int &): 1 Blip(int &): 1 Boom(const int &): 0 Boom(int&): 0


