2012-06-04 9 views
10

C++で新しいユーザー定義リテラルのコンセプトは、以下のような文字列リテラルのいくつかの非常に興味深い用途、示唆:文字列ベースのユーザー定義リテラルを強く入力できますか?

template <char... Chars> Name<Chars...> operator "" _name() { 
    return Name<Chars...>(); 
} 

auto a = 123_name; // OK 
auto b = "abc"_name; // Error 
:しかし

"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の中の構築物、例えば、これらの種類をビルドするとき

私は次のエラーを取得:私は可変引数テンプレートフォームが導出UDLsに利用できないことを推測している、周り読め

…unable to find string literal operator ‘operator"" _name’ with ‘const char [4]’, ‘long unsigned int’ arguments 

を文字列リテラルからの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

2つの機能の同時開発により、もう一方の機能を使用できなくなったのですか? –

+0

@Matthieu M.私はそうは思わない。私は彼らが別々に開発されているという証拠を見つけることはできません(彼らは常に同じ論文にまとめられています)。正直言って、私がvariadicフォームを見たとき、最初に頭に浮かんだのは、OPがその答えで示しているようなアイディアでした。私は委員会がこれについていくつかの潜在的な問題を見たと思っています。どちらか、それとも非常に面倒な見落としです。 –

+3

バリデーション形式の使用を許可するユーザー定義のリテラルはすべて、基本的なソース文字セットに制限されています(単純に文法がintまたはfloatに何も許可しないためです)。文字列リテラルにはその制限がないため、マルチバイトのソース/実行エンコーディングでは文字列リテラルにc-charがあり、個々の文字として表現できない場合があります。これは、文字列リテラルで可変的なフォームを許可しないという決定に関係しているかもしれません。 – bames53

2

これを可能にするN3599は、gccとclangで実装されています。

template<class CharT, CharT... chars> 
int operator ""_suffix(){ 
    return 42; 
} 
関連する問題