[英]Erasing character type and string length in a static string injected as NTTP?
我目前正面临一个与字符串文字和类型擦除有关的模板元编程问题。
问题如下。 让我们考虑以下代码:
template <static_string name> struct id {
using type = decltype(name);
};
static_assert(std::is_same_v<
typename id<"Hey">::type,
typename id<"Hello!">::type
>)
问题:如何设计一个 class static_string
,它将作为其类型的一部分“擦除”字符类型及其长度,以便上面的static_assert
不会失败?
简短版本:你不能。
非类型模板参数 (NTTP) 的类型需要提供“结构相等”。 这意味着这种类型的两个对象是相等的(就模板实例化而言)当且仅当存储在每个 object 中的字节序列是相等的。
如果您有一个旨在用作 NTTP 的字符串类型,则它必须在其自身中存储字符序列。 这意味着它将被存储为某种数组。 这些字符的类型和存储的字符数是该类型定义的一部分。
您的static_string
类型可能具有可变大小。 为此,您可以为它们提供固定的内部缓冲区大小,并让构造函数计算给定字符串的长度并将其存储在内部。 但是,这样的类型不能有可变字符类型。 这只是类型组件的一部分。
没问题:
struct static_string {
constexpr static_string(char const*) { }
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.