如果T不是字符类型,则Basic_String<T>有什么用处吗?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (70)
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正常1,这是有意义的:毕竟,我们不能假设应该如何打印一个整数字符串或MyFancyClass埃斯。

但无论如何,创造奇怪实例basic_string不被禁止;一方面,由于缺少禁止使用(即概念)的特性,另一方面由于缺乏编码,所以不被禁止。basic_string不限制底层类型比以相反的方式(没有概念)更容易,所以,这让我感到奇怪:

  • 有什么用吗std::basic_string<T>在哪里T不是字符类型吗?
提问于
用户回答回答于

如果所处理的系统处理多个文本编码(例如,ASCII和EBCDIC),则可能需要为每种编码提供单独的字符类型和字符串类型。它们都应该被视为字符串,但它们显然是不同的类型。

用户回答回答于

在构建令牌程序时,charn或者想到了枚举。

#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;
}

扫码关注云+社区

领取腾讯云代金券