Il nuovo concetto letterale definito dall'utente in C++ suggerisce alcuni usi molto interessanti di stringa-letterali, come ad esempio:È possibile digitare fortemente i valori letterali definiti dall'utente basati su stringhe?
"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;
Tuttavia, quando ho costruire questo tipo di costrutti a gcc, per esempio:
template <char... Chars> Name<Chars...> operator "" _name() {
return Name<Chars...>();
}
auto a = 123_name; // OK
auto b = "abc"_name; // Error
ottengo il seguente errore:
…unable to find string literal operator ‘operator"" _name’ with ‘const char [4]’, ‘long unsigned int’ arguments
da leggendo in giro, sto cercando di indovinare che la forma variadic-modello non è disponibile per UDL DERIVE d da stringhe letterali.
- È infatti il caso che i valori letterali di stringa non possono essere risolti utilizzando il modulo modello variadic?
- Se sì, qualcuno ha qualche idea sul perché una tale forma utile di UDL è stata lasciata fuori dallo standard?
Che cosa è esattamente utile creare un nuovo tipo per ogni tipo di letterale, che sarebbe completamente distinto l'uno dall'altro? –
@NicolBolas: negli esempi mostrati, * vuoi * diversi valori letterali per avere tipi diversi. Inoltre, il tipo finale di un letterale non sarebbe necessariamente una ingenua concatenazione dei suoi personaggi. Ad esempio, "" freq:% g Hz "world" _fmt (44000) 'potrebbe risolversi in qualcosa come' Formatter ("freq:", "Hz") (44000) 'tramite metaprogrammazione –
Ciò significherebbe anche che tu * non puoi * passarlo qualcosa che non è un numero, quindi non puoi passarlo a qualcosa che potrebbe usare 'operator <<' per convertire in un flusso, rimuovendo così la possibilità di personalizzare i tipi di dati. –