簡體   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