如何设计static_string类擦除字符类型与长度以通过静态断言?
实现类型擦除的static_string解决方案
要让不同字符串字面量对应的id::type类型相同,核心是让static_string成为一个单一的非模板类,而非随字符串长度/类型变化的模板实例。以下是具体实现:
1. 定义static_string类
#include <cstddef> struct static_string { const char* data; std::size_t size; // 从字符串字面量隐式构造,适配任意长度 template <std::size_t N> constexpr static_string(const char (&str)[N]) noexcept : data(str), size(N - 1) {} // 直接从指针和长度构造(可选,用于扩展场景) constexpr static_string(const char* ptr, std::size_t len) noexcept : data(ptr), size(len) {} };
2. 验证原断言逻辑
template <static_string name> struct id { using type = decltype(name); // 所有实例的type均为static_string }; // 断言会成功,因为两个id的type成员是同一类型 static_assert(std::is_same_v< typename id<"Hey">::type, typename id<"Hello!">::type >);
关键原理说明
- 类型擦除:
static_string是普通类而非模板类,无论传入的字符串字面量长度、内容如何,decltype(name)的结果都是static_string,彻底擦除了字符串在类型层面的差异。 - C++20兼容性:该实现依赖C++20的特性——允许用户定义的字面类型作为非类型模板参数,确保字符串字面量能直接传递给模板参数
name。 - 生命周期安全:字符串字面量属于静态存储期,
static_string持有的指针不会悬空。
内容的提问来源于stack exchange,提问作者Vincent
相关产品推荐
相关产品推荐

