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