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。
- バリデーションテンプレートフォームを使用して文字列リテラルを解決できないのは実際ですか?
- そのような場合、そのような有用な形式のUDLが標準から除外された理由については誰にも分かりませんか?
すべてのリテラルに対して新しいタイプを作成する場合、まったく別のタイプのタイプを作成するとどんなに役に立ちますか? –
@NicolBolas:ここに示した例では、異なるリテラルに異なる型を持たせたいと考えています。さらに、リテラルの最終的な型は必ずしもその文字の素朴な連結ではありません。例えば、 "freq:%g Hz" world "_fmt(44000)'は、メタプログラミングによって 'Formatter(" freq: "、" Hz ")(44000)'のように解決されるかもしれません。 –
これはまた、数値ではないものを渡すことはできないので、 'operator << 'を使ってストリームに変換してデータ型をカスタマイズする可能性を排除することはできません。 –