El nuevo concepto literal definido por el usuario en C++ sugiere algunos usos muy interesantes de cadena literales, tales como:¿Pueden los literales definidos por el usuario basados en cadenas estar fuertemente tipados?
"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;
Sin embargo, cuando construyo este tipo de construcciones en gcc, por ejemplo:
template <char... Chars> Name<Chars...> operator "" _name() {
return Name<Chars...>();
}
auto a = 123_name; // OK
auto b = "abc"_name; // Error
me sale el siguiente error:
…unable to find string literal operator ‘operator"" _name’ with ‘const char [4]’, ‘long unsigned int’ arguments
de la lectura de todo, supongo que la forma variadic-plantilla no está disponible para los UDL derivan d de literales de cadena.
- ¿Es de hecho el caso que los literales de cadena no se pueden resolver usando el formulario de plantilla variadic?
- Si es así, ¿alguien tiene alguna idea de por qué una forma tan útil de UDL se quedó fuera de la norma?
¿Qué es exactamente útil sobre la creación de un nuevo tipo para cada literal, tipos que serían completamente distintos el uno del otro? –
@NicolBolas: en los ejemplos que se muestran, * quieres * literales diferentes para tener diferentes tipos. Además, el tipo final de un literal no sería necesariamente una concatenación ingenua de sus caracteres. Por ejemplo, '" freq:% g Hz "world" _fmt (44000) 'podría resolver algo como' Formatter ("freq:", "Hz") (44000) 'mediante metaprogramación. –
Eso también significaría que * no * puede pasarle algo que no es un número. Por lo tanto, no podría pasarle algo que podría usar 'operator <<' para convertirlo en una secuencia, eliminando así la posibilidad de personalizar los tipos de datos. –