Существует ли использование для basic_string <T>, где T не является типом символа?

Объявление строки С++ является следующим:

template< 
    class CharT, 
    class Traits = std::char_traits<CharT>, 
    class Allocator = std::allocator<CharT>
> class basic_string;

CharT - тип символа, который может быть char, wchar_t, char16_t и char32_t; но в конце концов basic_string является шаблоном, поэтому его можно создать с помощью других CharT и других распределителей. Хотя я могу думать в некоторых случаях использования для других распределителей, я не могу думать в случаях использования для строк других типов данных, например:

using string = std::basic_string<int>;

Используя цепочку целых чисел, мы не можем инициализировать ее как строку (очевидную), а не строку u32 (что не очевидно, по крайней мере для меня); но мы можем инициализировать его с помощью initializer_list, пока содержащийся тип списка может быть конвертирован в int:

string err1("test");   // Error!
string err2(U"test");  // Error!
string err3{"test"};   // Error!
string err4{U"test"};  // Error!
string err5 = "test";  // Error!
string err6 = U"test"; // Error!

string success1({U't', U'e', U's', U't'});
string success2 = {U't', U'e', U's', U't'};
string success3({'t', 'e', 's', 't'});
string success4 = {'t', 'e', 's', 't'};

Но даже если нам удастся инициализировать целую строку, мы не сможем использовать ее обычным способом:

std::cout << success1; // Error! expected 116101115116

Единственный basic_string, который, как ожидается, будет использоваться с cout, является нормальным, что имеет смысл: ведь мы не можем предположить, как предполагается напечатать строку целых чисел или строку MyFancyClass es.

Но в любом случае создание странных экземпляров basic_string не запрещено; с одной стороны, не запрещается из-за отсутствия признаков, запрещающих использование (иначе говоря, понятий), а по другому кодированию basic_string без ограничения базового типа проще, чем делать это наоборот (без понятий), так что это делает меня удивляет:

  • Используется ли для std::basic_string<T> где T не тип символа?

Что касается любого использования, я думаю о вещах, которые могут быть достигнуты только с помощью строк T, и это невозможно сделать с помощью вектора T (или это будет значительно сложнее), другими словами:

  • Вы когда-нибудь сталкивались с ситуацией, когда строка T является лучшим выбором?

Ответы

Ответ 1

При создании токенизатора приходит в виду char [n] или enum. Обратите внимание, что конструктор Token не запускается basic_string.

#include <iostream>
#include <string>
#include <string.h>

static const int max_token_length = 10;

struct Token
{
    char str[max_token_length];
};

// define std::char_traits<Token> if your implementation defaults are not fine for you (or don't exist as it not required)

int main() {
    Token t;
    strncpy( t.str, "for", max_token_length );
    std::basic_string<Token> s1( 1, t );

    Token u;
    strncpy( t.str, "for", max_token_length );
    std::basic_string<Token> s2( 1, u );

    std::basic_string<Token> s = s1 + s2;

    return 0;
}

Ответ 2

Если вы имеете дело с системой, которая обрабатывает несколько текстовых кодировок (например, ASCII и EBCDIC), вам может понадобиться отдельный тип символа и тип строки для каждой кодировки. Они должны рассматриваться как строки, но явно различающиеся типы.