繁体   English   中英

擦除作为 NTTP 注入的 static 字符串中的字符类型和字符串长度?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM