basic_string <t>有什么用处,其中T不是字符类型?

时间:2016-03-03 14:50:57

标签: c++ string

C ++字符串is the following的声明:

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

CharT是字符类型,可以是charwchar_tchar16_tchar32_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字符串是更好的选择?

2 个答案:

答案 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),则可能需要为每种编码使用单独的字符类型和字符串类型。它们都应该被视为字符串,但显然是不同的类型。