tipos - ¿Es posible en C++ moderno pasar un literal de cadena como un parámetro a una plantilla de C++?
leer cadena de caracteres en c (1)
¿Es posible en "C ++ moderno" (C ++ 17 o superior) pasar un literal de cadena como parámetro a una plantilla de C ++?
Me doy cuenta de que podrías hacer esto con el argumento del constructor; Simplemente pensé que sería más conveniente tenerlo como un argumento de plantilla, en lugar de enterrarlo profundamente en el archivo cpp. Tenía curiosidad si tal vez esta era una característica nueva de C ++ moderno. Ver el pseudo código a continuación de lo que estoy tratando de hacer:
Ejemplo de pseudocódigo:
// Header File /////////////////////////
template<constexpr string Name>
class ModuleBase {
public:
ModuleBase();
string name;
};
class xyz : ModuleBase<"xyz"> {
public:
xyz();
};
// Cpp File //////////////////////////
template<string_literal Name>
ModuleBase<Name>::ModuleBase() {
name = Name;
}
xyz::xyz() : ModuleBase() {
}
Sí, en c ++ 20 .
El problema era que la determinación de la singularidad de un argumento de no tipo de plantilla era difícil.
c ++ 20 añade una <=>
comparación de operador de nave espacial. Si no es proporcionado por el usuario (y se basa a su vez fuera de <=>
a su vez, repita de forma recursiva) (y algunos otros requisitos; vea p0732 ), el tipo se puede usar como un argumento de plantilla no tipo.
Dichos tipos se pueden construir a partir de "strings"
en constexpr
en los constructores constexpr
, incluido el uso de guías de deducción de c ++ 17 para que se auto-dimensionen.
Como el tamaño de los datos almacenados probablemente formará parte del tipo, querrá tomar el tipo como un parámetro no tipificado de tipo automático o un tipo de deducción automática.
Tenga en cuenta que colocar la implementación de su plantilla en un archivo cpp suele ser una mala idea. Pero esa es otra pregunta.