我可以用constexpr方式获取C ++类型名称吗? [英] Can I obtain C++ type names in a constexpr way?

查看:131
本文介绍了我可以用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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆