首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >当T不是字符类型时,basic_string<T>有什么用处吗?

当T不是字符类型时,basic_string<T>有什么用处吗?
EN

Stack Overflow用户
提问于 2016-03-03 22:50:57
回答 2查看 1.2K关注 0票数 20

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字符串(至少对我来说不是那么明显);但只要列表包含的类型可以转换为int,我们就可以用initializer_list初始化它

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

唯一期望与cout一起使用的basic_string是普通的,这是有意义的:毕竟,我们不能假设应该如何打印一个整数字符串或一个MyFancyClassE字符串。

但不管怎样,basic_string的奇怪实例的创建并不是被禁止的;一方面,由于缺乏禁止使用的功能,因此没有被禁止。概念),而在不限制底层类型的情况下编写basic_string比以相反的方式(没有概念)更容易,这让我想知道:

  • std::basic_string<T>不是字符类型的情况下,T有什么用处吗?

至于任何用途,我正在考虑的事情只能通过T字符串来实现,而不能通过T的向量来完成(否则它将更难做到),换句话说:

  • 你有没有遇到过一串T是更好的选择的情况?
EN

回答 2

Stack Overflow用户

发布于 2016-06-17 23:21:01

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

票数 3
EN

Stack Overflow用户

发布于 2016-06-17 18:08:38

在构建记号赋予器时,会想到charn或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;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35775405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档