首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否可以以常量表达式的方式获取C++类型名称?

是否可以以常量表达式的方式获取C++类型名称?
EN

Stack Overflow用户
提问于 2016-03-11 21:06:24
回答 1查看 11.9K关注 0票数 37

我想在编译时使用类型的名称。例如,假设我写了:

代码语言:javascript
运行
复制
constexpr size_t my_strlen(const char* s)
{
        const char* cp = s;
        while(*cp != '\0') { cp++; };
        return cp - s;
}

现在我想要的是:

代码语言:javascript
运行
复制
template <typename T>
constexpr auto type_name_length = my_strlen(typeid(T).name());

但是,typeid(T).name()只是const char*,而不是常量...有没有其他的常量表达式方法来获取类型的名称?

EN

回答 1

Stack Overflow用户

发布于 2016-03-11 23:02:57

嗯,你可以,某种程度上,但可能不是很便携:

代码语言:javascript
运行
复制
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定义为:

代码语言:javascript
运行
复制
template <typename T>
constexpr auto type_name_length = get_name<T>().size;

DEMO (适用于clang & g++)

票数 99
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35941045

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档