我想在编译时使用类型的名称。例如,假设我写了:
constexpr size_t my_strlen(const char* s)
{
const char* cp = s;
while(*cp != '\0') { cp++; };
return cp - s;
}现在我想要的是:
template <typename T>
constexpr auto type_name_length = my_strlen(typeid(T).name());但是,typeid(T).name()只是const char*,而不是常量...有没有其他的常量表达式方法来获取类型的名称?
发布于 2016-03-11 23:02:57
嗯,你可以,某种程度上,但可能不是很便携:
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 {};
}您可以将所需的type_name_length定义为:
template <typename T>
constexpr auto type_name_length = get_name<T>().size;DEMO (适用于clang & g++)
https://stackoverflow.com/questions/35941045
复制相似问题