and c++ reflection c++14 constexpr compile-time

and - ¿Puedo obtener nombres de tipo C++ de forma constexpr?



constexpr in c++ (1)

Me gustaría usar el nombre de un tipo en tiempo de compilación. Por ejemplo, supongamos que he escrito:

constexpr size_t my_strlen(const char* s) { const char* cp = s; while(*cp != ''/0'') { cp++; }; return cp - s; }

Y ahora quiero tener:

template <typename T> constexpr auto type_name_length = my_strlen(typeid(T).name());

Pero, por desgracia, typeid(T).name() es simplemente const char* , no constexpr ... ¿hay alguna otra forma, constexpr, de obtener el nombre de un tipo?


Bueno, podrías, más o menos, pero probablemente no bastante portátil:

struct string_view { char const* data; std::size_t size; }; inline std::ostream& operator<<(std::ostream& o, string_view const& s) { return o.write(s.data, s.size); } template<class T> constexpr string_view get_name() { char const* p = __PRETTY_FUNCTION__; while (*p++ != ''=''); for (; *p == '' ''; ++p); char const* p2 = p; int count = 1; for (;;++p2) { switch (*p2) { case ''['': ++count; break; case '']'': --count; if (!count) return {p, std::size_t(p2 - p)}; } } return {}; }

Y puedes definir tu type_name_length deseado como:

template <typename T> constexpr auto type_name_length = get_name<T>().size;

DEMO (trabaja para clang & g ++)