我可以用constexpr方式获取C ++类型名称吗? [英] Can I obtain C++ type names in a constexpr way?
本文介绍了我可以用constexpr方式获取C ++类型名称吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想在编译时使用类型的名称。例如,假设我写了:
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 *
,不是constexpr ...有一些其他的,constexpr方法来获取类型的名称?
<$ c> $ c> 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
as:
template< typename T>
constexpr auto type_name_length = get_name< T>()。size;
DEMO (适用于clang&g ++)
I would like to use the name of a type at compile time. For example, suppose I've written:
constexpr size_t my_strlen(const char* s)
{
const char* cp = s;
while(*cp != '\0') { cp++; };
return cp - s;
}
and now I want to have:
template <typename T>
constexpr auto type_name_length = my_strlen(typeid(T).name());
But alas, typeid(T).name()
is just const char*
, not constexpr... is there some other, constexpr way to get a type's name?
解决方案
Well, you could, sort of, but probably not quite portable:
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 {};
}
And you can define your desired type_name_length
as:
template <typename T>
constexpr auto type_name_length = get_name<T>().size;
DEMO (works for clang & g++)
这篇关于我可以用constexpr方式获取C ++类型名称吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文