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 | #include <utility> template <typename F, typename Arg> struct Callable { private: typedef char yes; typedef struct { char array[2]; } no; template <typename G, typename Brg> static yes test(decltype(std::declval<G>()(std::declval<Brg>())) (G::*pfn)(Brg)); template <typename G, typename Brg> static yes test(decltype(std::declval<G>()(std::declval<Brg>())) (G::*pfn)(Brg) const); template <typename G, typename Brg> static no test(...); public: static bool const value = sizeof(test<F, Arg>(&F::operator())) == 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 Boom { }; #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 << "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 << "Boom(const int &): " << Callable<Boom, const int &>::value << std::endl << "Boom(int&): " << Callable<Boom, int &>::value << std::endl ; } |
I2luY2x1ZGUgPHV0aWxpdHk+Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgRiwgdHlwZW5hbWUgQXJnPgpzdHJ1Y3QgQ2FsbGFibGUKewpwcml2YXRlOgogIHR5cGVkZWYgY2hhciAgICAgICAgICAgICAgICAgICAgICB5ZXM7CiAgdHlwZWRlZiBzdHJ1Y3QgeyBjaGFyIGFycmF5WzJdOyB9IG5vOwoKICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRywgdHlwZW5hbWUgQnJnPgogIHN0YXRpYyB5ZXMgdGVzdChkZWNsdHlwZShzdGQ6OmRlY2x2YWw8Rz4oKShzdGQ6OmRlY2x2YWw8QnJnPigpKSkgKEc6OipwZm4pKEJyZykpOwoKICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRywgdHlwZW5hbWUgQnJnPgogIHN0YXRpYyB5ZXMgdGVzdChkZWNsdHlwZShzdGQ6OmRlY2x2YWw8Rz4oKShzdGQ6OmRlY2x2YWw8QnJnPigpKSkgKEc6OipwZm4pKEJyZykgY29uc3QpOwoKICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRywgdHlwZW5hbWUgQnJnPgogIHN0YXRpYyBubyB0ZXN0KC4uLik7CgpwdWJsaWM6CiAgc3RhdGljIGJvb2wgY29uc3QgdmFsdWUgPSBzaXplb2YodGVzdDxGLCBBcmc+KCZGOjpvcGVyYXRvcigpKSkgPT0gc2l6ZW9mKHllcyk7Cn07CgpzdHJ1Y3QgRm9vCnsKICBpbnQgb3BlcmF0b3IoKShpbnQgJikgeyByZXR1cm4gMTsgfQoKfTsKCnN0cnVjdCBCYXIKewogIGludCBvcGVyYXRvcigpKGludCBjb25zdCAmKSB7IHJldHVybiAyOyB9Cn07CgpzdHJ1Y3QgV2F6egp7CiAgaW50IG9wZXJhdG9yKCkoaW50IGNvbnN0ICYpIGNvbnN0IHsgcmV0dXJuIDM7IH0KfTsKCnN0cnVjdCBGcm9iCnsKICBpbnQgb3BlcmF0b3IoKShpbnQgJikgeyByZXR1cm4gNDsgfQogIGludCBvcGVyYXRvcigpKGludCBjb25zdCAmKSBjb25zdCB7IHJldHVybiA1OyB9Cn07CgpzdHJ1Y3QgQm9vbQp7Cgp9OwoKI2luY2x1ZGUgPGlvc3RyZWFtPgppbnQgbWFpbigpCnsKICBzdGQ6OmNvdXQgPDwgIkZvbyhjb25zdCBpbnQgJik6ICAiIDw8IENhbGxhYmxlPEZvbywgIGludCBjb25zdCAmPjo6dmFsdWUgPDwgc3RkOjplbmRsCiAgICAgICAgICAgIDw8ICJGb28oaW50ICYpOiAgICAgICAgIiA8PCBDYWxsYWJsZTxGb28sICBpbnQgJj46OnZhbHVlIDw8IHN0ZDo6ZW5kbAogICAgICAgICAgICA8PCAiQmFyKGNvbnN0IGludCAmKTogICIgPDwgQ2FsbGFibGU8QmFyLCAgY29uc3QgaW50ICY+Ojp2YWx1ZSA8PCBzdGQ6OmVuZGwKICAgICAgICAgICAgPDwgIkJhcihpbnQgJik6ICAgICAgICAiIDw8IENhbGxhYmxlPEJhciwgIGludCAmPjo6dmFsdWUgPDwgc3RkOjplbmRsCiAgICAgICAgICAgIDw8ICJXYXp6KGNvbnN0IGludCAmKTogIiA8PCBDYWxsYWJsZTxXYXp6LCBjb25zdCBpbnQgJj46OnZhbHVlIDw8IHN0ZDo6ZW5kbAogICAgICAgICAgICA8PCAiV2F6eihpbnQgJik6ICAgICAgICIgPDwgQ2FsbGFibGU8V2F6eiwgaW50ICY+Ojp2YWx1ZSA8PCBzdGQ6OmVuZGwKICAgICAgICAgICAgPDwgIkZyb2IoY29uc3QgaW50ICYpOiAiIDw8IENhbGxhYmxlPEZyb2IsIGNvbnN0IGludCAmPjo6dmFsdWUgPDwgc3RkOjplbmRsCiAgICAgICAgICAgIDw8ICJGcm9iKGludCAmKTogICAgICAgIiA8PCBDYWxsYWJsZTxGcm9iLCBpbnQgJj46OnZhbHVlIDw8IHN0ZDo6ZW5kbAogICAgICAgICAgICA8PCAiQm9vbShjb25zdCBpbnQgJik6ICIgPDwgQ2FsbGFibGU8Qm9vbSwgY29uc3QgaW50ICY+Ojp2YWx1ZSA8PCBzdGQ6OmVuZGwKICAgICAgICAgICAgPDwgIkJvb20oaW50Jik6ICAgICAgICAiIDw8IENhbGxhYmxlPEJvb20sIGludCAmPjo6dmFsdWUgPDwgc3RkOjplbmRsCiAgICA7Cn0=
prog.cpp: In instantiation of 'const bool Callable<Boom, const int&>::value': prog.cpp:61:70: instantiated from here prog.cpp:20:79: error: 'operator()' is not a member of 'Boom' prog.cpp: In instantiation of 'const bool Callable<Boom, int&>::value': prog.cpp:62:64: instantiated from here prog.cpp:20:79: error: 'operator()' is not a member of 'Boom'
-
result: Compilation error (maybe you wish to see an example for C++11)


