C ++字符串is the following的声明:
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
字符串是更好的选择?答案 0 :(得分:2)
构建tokenizer时,会想到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's 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;
}
答案 1 :(得分:2)
如果您正在处理处理多种文本编码的系统(例如ASCII和EBCDIC),则可能需要为每种编码使用单独的字符类型和字符串类型。它们都应该被视为字符串,但显然是不同的类型。