C++ type introspection at compile-time