Почему std::basic_string имеет два отдельных параметра шаблона _Elem (тип char) и _Traits (характеристики char)?

Проблема в том, что я не понимаю, почему они должны быть отдельными. Почему бы не использовать один класс, например CharType, который содержал бы как логику трейтов char, так и тип char. Я имею в виду заменить это:

      template <class _Elem, class _Traits = char_traits<_Elem>, class _Alloc = allocator<_Elem>>
class basic_string { /*...*/ };

с этим:

      template <class ExtendedTraits, class _Alloc = allocator<_Elem>>
class basic_string { /*...*/ };

где ExtendedTraits — указанная комбинация _Elem и _Traits, которая может выглядеть так:

      template<_CharType> //all the necessary template parameters
class extended_traits 
{
public:
    using value_type = _CharType;
private:
    _CharType _elem;
public:
//... all methods, that used to be in char_traits but now non-static and accepting one parameter

};

Пробовал реализовать оба подхода, оба работают, но могут быть какие-то проблемы, которых я пока не замечаю.

1 ответ

Я думаю, что имеет смысл отделить тип персонажа от объекта. — это дополнительный класс для сравнения символов и тому подобного, который по своей сути отличается от типа символа. Ваш метод будет работать, но его эквивалентом будет объединение двух совершенно разных функций в одну и ту же функцию.

Также более очевидно, какой тип символов использует строка. Например:

      typedef string basic_string<char>;

гораздо очевиднее, чем

      typedef string basic_char<extended_traits<char>, ...>;

так как есть дополнительный уровень вложенности и больше символов и тому подобное.

В конце концов, нас не волнует, что есть, нас волнует тип символа строки. предназначен для внутренних операций и предназначен для абстрагирования; как таковой, он отделен от типа символа, что должно быть более очевидным, поскольку указывает, какие типы значений может содержать строка.

По крайней мере, это мой взгляд на вещи.

Кроме того, не обязательно плохо иметь больше шаблонных аргументов для, тем более, что есть только один аргумент шаблона, для которого вам действительно нужно определить параметр, а для другого шаблона заданы типы по умолчанию. Мне нечасто приходилось определять свой собственный класс. Но если бы я хотел определить свой собственный отдельный строковый класс с пользовательским символом или чем-то подобным, мне пришлось бы определитькласс для него, даже если я написал свой оператор присваивания и операторы сравнения и все остальное. Это особенно раздражало бы.

Другие вопросы по тегам