2012-06-04 50 views
10

在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來自字符串文字。

  1. 實際上是不是使用可變參數模板形式解決字符串文字的情況?
  2. 如果是這樣,有沒有人有任何洞察到爲什麼這樣一種有用的UDL形式被排除在標準之外?
+0

對於爲每一個文字創建一個新類型,這些類型完全不同於另一個文字有什麼用處? –

+0

@NicolBolas:在示例中,您*希望*不同的文字具有不同的類型。此外,文字的最終類型不一定是其字符的簡單連接。例如,'freq:%g Hz'world'_fmt(44000)'可能會通過元編程的方式解析爲類似Formatter (「freq:」,「Hz」)(44000)「。 –

+0

這也意味着你*不能傳遞它不是數字的東西,所以你不能傳遞它可能使用'operator <<'轉換成流的東西,從而消除了定製數據類型的可能性。 –

回答

8

你說得對。字符串文字不能與可變參數模板形式(§2.14.8/ 5)使用:

If L is a user-defined-string-literal, let str be the literal without its ud-suffix and let len be the number of code units in str (i.e., its length excluding the terminating null character). The literal L is treated as a call of the form

operator "" X (str, len) 

我已經通過的建議文件(最近的我能找到的N2750)洗牌,找不到一個解釋不允許使用可變模板形式。

+0

這可能是微不足道的兩個功能的共同發展阻止了另一個使用另一個? –

+0

@Matthieu M.我不這麼認爲。我無法找到他們正在單獨開發的證據(他們總是在同一篇論文中)。說實話,當我看到可變形式時,首先想到的就是OP在答案中展示的那種想法。我想假設委員會在這方面看到了一些潛在的問題。無論是這個還是一個非常煩人的疏忽。 –

+3

所有允許使用可變形式的用戶定義文字都限於基本源字符集(僅僅因爲語法不允許其他內容或浮點數)。字符串文字沒有這個限制,所以對於多字節源文件/執行編碼,你可以在字符串文字中使用c-chars,而這些c-chars可能不能表示爲單個字符。這可能與決定不允許使用字符串文字的可變形式有關。 – bames53

2

允許這個的N3599已經在gcc和clang中實現了。

template<class CharT, CharT... chars> 
int operator ""_suffix(){ 
    return 42; 
} 
相關問題