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 ++)