2009-11-02 16 views

Respuesta

49

std::basic_string es una plantilla de clase para la fabricación de cuerdas de tipos de caracteres, std::string es una typedef para una especialización de la plantilla de clase para char. Sí, ambos son necesarios (o al menos requeridos por el estándar).

+9

¿por qué ambos son necesarios? –

+1

, entonces usted dice que std :: string es typedef std :: basic_string std :: string? –

+1

@MuhammadAnnaqeeb 2.5 años tarde, pero la respuesta breve es proporcionar soporte ancho de cadena (wstring) (Unicode, 2 bytes por caracter, wchar_t) también. – Andrew

26

std::string es una instanciación de std::basic_string<T>:

typedef std::basic_string<char> string 

std::basic_string es necesario tener una interfaz similar para todo tipo de cuerdas (wstring por ejemplo).

+22

El término correcto es "especialización". 'string' es una * especialización * de' basic_string'. – AnT

+1

Supongo que podrías discutir sobre eso. La "especialización" se usa generalmente para indicar herencia. Una instanciada {clase | función} se instancia al sustituir los argumentos de la plantilla. Hay una especialización de plantilla parcial, pero esto no se usa aquí. – pmr

+4

Referirse a una clase derivada como una 'especialización' es un uso menos formal de 'especialización'. La palabra 'especialización' no se usa así en absoluto en el estándar (estoy bastante seguro), pero se usa ampliamente para describir la especialización de plantillas. El nombre de una especialización de plantilla se puede usar en contextos que no fuerzan ni la creación de instancias implícitas, por lo que la especialización y la creación de instancias son conceptos separados. Además de una especialización de plantilla (el nombre de una plantilla con un conjunto particular de parámetros), también hay especializaciones parciales (solo plantillas de clase) y especializaciones explícitas. –

13

A std::string es una instanciación de la plantilla std::basic_string con un tipo de char. Necesita ambos para poder crear cadenas de cosas además de char, como std::basic_string<wchar_t> para una cadena de caracteres anchos. O si desea una cadena con elementos de 32 bits, std::basic_string<unsigned int>.

Cuestiones relacionadas