Существует ли использование для 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), вам может понадобиться отдельный тип символа и тип строки для каждой кодировки. Они должны рассматриваться как строки, но явно различающиеся типы.