在C++中新的用戶定義的字面概念提出字符串常量的一些非常有趣的用途,如:基於字符串的用戶定義文字是否可以強類型化?
"Goodbye %s world"_fmt("cruel");
"Goodbye %s world"_fmt(123); // Error: arg 1 must be convertible to const char*
R"(point = \((\d+), (\d+)\))"_re; // Builds DFA at compile-time.
typedef table<
column<"CustId"_name , std::string>,
column<"FirstName"_name, std::string>,
column<"LastName"_name , std::string>,
column<"DOB"_name , date >
> Customer;
然而,當我建立這些種GCC結構,例如:
template <char... Chars> Name<Chars...> operator "" _name() {
return Name<Chars...>();
}
auto a = 123_name; // OK
auto b = "abc"_name; // Error
我得到以下錯誤:
…unable to find string literal operator ‘operator"" _name’ with ‘const char [4]’, ‘long unsigned int’ arguments
從讀書的時候,我猜的可變參數模板形式並不適用於包括UDL派生d來自字符串文字。
- 實際上是不是使用可變參數模板形式解決字符串文字的情況?
- 如果是這樣,有沒有人有任何洞察到爲什麼這樣一種有用的UDL形式被排除在標準之外?
對於爲每一個文字創建一個新類型,這些類型完全不同於另一個文字有什麼用處? –
@NicolBolas:在示例中,您*希望*不同的文字具有不同的類型。此外,文字的最終類型不一定是其字符的簡單連接。例如,'freq:%g Hz'world'_fmt(44000)'可能會通過元編程的方式解析爲類似Formatter(「freq:」,「Hz」)(44000)「。 –
這也意味着你*不能傳遞它不是數字的東西,所以你不能傳遞它可能使用'operator <<'轉換成流的東西,從而消除了定製數據類型的可能性。 –