Quelle est la différence entre std::string
et std::basic_string
? Et pourquoi les deux sont nécessaires?Quelle est la différence entre std :: string et std :: basic_string? Et pourquoi les deux sont nécessaires?
Répondre
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).
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).
Le terme approprié est "spécialisation". 'string' est une * spécialisation * de' basic_string'. – AnT
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
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. –
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>
.
pourquoi les deux sont-ils nécessaires? –
donc vous dites que std :: string est typedef std :: basic_string std :: string? –
@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