2009-11-02 1 views

Répondre

49

std::basic_string est un modèle de classe pour faire des chaînes de types de caractères, std::string est un typedef pour une spécialisation de ce modèle de classe pour char. Oui, ils sont tous deux nécessaires (ou au moins requis par la norme).

+9

pourquoi les deux sont-ils nécessaires? –

+1

donc vous dites que std :: string est typedef std :: basic_string std :: string? –

+1

@MuhammadAnnaqeeb 2,5 ans de retard, mais la réponse courte est de fournir un support de type chaîne large (wstring) (Unicode, 2 octets par caractère, wchar_t). – Andrew

26

std::string est une instanciation de std::basic_string<T>:

typedef std::basic_string<char> string 

std::basic_string est nécessaire d'avoir une interface similaire pour tous les types de chaînes (wstring par exemple).

+22

Le terme approprié est "spécialisation". 'string' est une * spécialisation * de' basic_string'. – AnT

+1

Je suppose que vous pourriez discuter à ce sujet. "spécialisation" est généralement utilisé pour indiquer l'héritage. Un template {function | function} est instancié en substituant les arguments template. Il y a une spécialisation de template partielle mais ceci n'est pas utilisé ici. – pmr

+4

Se référer à une classe dérivée comme une «spécialisation» est une utilisation moins formelle de la «spécialisation». Le mot «spécialisation» n'est pas du tout utilisé dans la norme (j'en suis presque sûr), mais il est largement utilisé pour décrire la spécialisation des modèles. Le nom d'une spécialisation de modèle peut être utilisé dans des contextes qui ne forcent pas et l'instanciation implicite de sorte que la spécialisation et l'instanciation sont des concepts distincts. En plus d'une spécialisation de modèle (le nom d'un modèle avec un ensemble particulier de paramètres), il existe également des spécialisations partielles (modèles de classe uniquement) et des spécialisations explicites. –

13

Une std::string est une instanciation du modèle std::basic_string avec un type de char. Vous avez besoin des deux pour que vous puissiez faire des chaînes de choses à part char, par exemple std::basic_string<wchar_t> pour une chaîne de caractères larges. Ou si vous voulez une chaîne avec des éléments de 32 bits, std::basic_string<unsigned int>.