#include #include #include template struct Kind { static int code() { return 0; } }; template struct Kind { static int code() { return 1; } }; template<> struct Kind { static int code() { return 2; } }; int main() { static_assert(std::is_pointer::value, "pointer case"); assert(Kind::code() == 0); assert(Kind::code() == 1); assert(Kind::code() == 2); assert(Kind::code() == 1); std::cout << Kind::code() << ' ' << Kind::code() << ' ' << Kind::code() << '\n'; }