为什么要自己封装个String类?原因很多。QT库有自己的QString类,MFC有自己的CString类。STL标准库有自己的std::string类。MySQL数据库的C API接口使用原生的char*指针。。。。。。

自己写的程序用那种String?没法选择。这时候可能需要写一个万能的String类和对接其它字符串类的接口。另一个原因是,效率问题;想获得最高的效率。还有就是本地化,国际化等原因。

从C++98开始,程序员们就开始造String轮子,方便自己学习和熟悉新的C++知识。现在我们用C++17的时髦思路,封装一个自己的String类。代码如下:

#include <iostream>
#include <cstdlib>
#include <string>#include <variant>
#include <array>
#include <cstring> //for std::strlen
#include <string_view>class String{
private:enum{ object_size = sizeof(std::string) };using string=std::string;using array=std::array<char,object_size> ;std::variant<std::monostate, string, array > data_;void set_data(const char* src){if (src==nullptr){data_.emplace<array>();auto& a = std::get<array>(data_);a[0]=0;}else if (std::strlen(src)>=object_size){data_.emplace<string>(src);}else{data_.emplace<array>();auto& a = std::get<array>(data_);std::copy(src,src+std::strlen(src),a.begin());a[std::strlen(src)]=0;}}public:String(const char* src){set_data(src);}void operator=(const char* src){set_data(src);}const char* c_str(){const char* ret = nullptr;switch (data_.index()){case 1:ret = std::get<string>(data_).c_str();break;case 2:ret = std::get<array>(data_).begin();break;}return ret;}std::string_view str(){switch (data_.index()){case 0:return std::string_view();case 1:return std::string_view(std::get<string>(data_));case 2:return std::string_view(std::get<array>(data_).begin());}}
};int main()
{  String s("12345");std::cout << s.c_str() << std::endl;s = "..............................hello world!";auto v1 = s.str();auto v2 = v1.substr(v1.find_first_not_of('.'));std::cout << v2 << std::endl;
}

现在分析一下,有哪些时髦(Modern)的地方。

1)使用了variant,这个东西就是超级的union体。当字符串长度较小时,我们用std::array的不malloc()的喜感;当字符串长度较长时,我们用std::string的动态内存便利性。

2)string_view。这个是从boost::string_ref移植过来的好东西。

3)屏蔽了底层的技术细节。发明这个东西,不再需要什么placement new之类的胡言论语。

char buf_[64];
new (buf_) std::string("12345");
reinterpret_cast<std::string*>(buf_)->~basic_string();  

4)剩下的功能,请尽情的改造吧

转载于:https://www.cnblogs.com/thomas76/p/8572799.html

C++ String封装相关推荐

  1. String封装——读时共享,写时复制

    碰到过一位一直怀疑C++标准库(STL)效率的人,他说STL效率太低,企业开发根本不会用.我是持反对意见的. 说这话的人,肯定没有做过大量的调查.没有调查就没有发言权. STL的效率是不低的,足够满足 ...

  2. string类具体用法

    string类具体用法 二话不说上代码 #include<string> #include<iostream> #include<algorithm> using ...

  3. javascript中最最最常用的方法封装

    javascript 常用方法的封装,小编持续升级中... 方法封装(js原生): 一.Object 类型 MHQ.ajaxUtils 定义一个ajax工具类 ajax 定义一个ajax工具函数 ge ...

  4. 【android-tips】关于string.xml的使用

    (转载请注明出处:http://blog.csdn.net/buptgshengod) 1.介绍 在制作android应用的时候,常常用到很多string,就是一些文字,这里介绍一种方法,将所有str ...

  5. String为什么是不可变类型?

    什么是不可变对象? 众所周知, 在Java中, String类是不可变的.那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的.不 ...

  6. java string 不变_为什么String在java中是不可变的?

    什么是不可变对象? 众所周知, 在Java中, String类是不可变的.那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的.不 ...

  7. STL之string类型

    1.String概念 string是STL的字符串类型,通常用来表示字符串.而在使用string之前,字符串通常是用char*表示的. string和char*的区别: string是一个类, cha ...

  8. C++ string容器

    头文件<string> Char是一个指针,String是一个类,string封装了char,管理这个字符串,是一个char*型的容器,不用考虑内存释放和越界. 构造方法 方法 描述 st ...

  9. c++之STl容器-string

    目录 容器的分类 string string的概念 string的初始化 string的遍历 string的一些基本操作 char*类型和string类型互转 字符串的连接 字符串的查找和替换 str ...

最新文章

  1. c语言编译器内部错误,C++致命错误C1001:编译器中发生内部错误
  2. 黑客高手对决常用术语及行规,一般人我不告诉他
  3. 工作314:uni-提交成功加入表单验证
  4. 一步步编写操作系统 66 浅析c库函数与系统调用1
  5. julia有 pytorch包吗_GitHub发布年度机器学习榜:TensorFlow最火,PyTorch失踪,Julia第四...
  6. CUDA C编程权威指南 第二章 CUDA编程模型
  7. VMX虚拟机环境下CentOS扩展home磁盘空间
  8. Android HAL 开发 (2)
  9. git SSH 公钥拉取代码(使用及配置)
  10. Next主题美化博客
  11. OOP的核心思想是什么?
  12. python画图软件是哪个_python画图软件是哪个
  13. java实现电子面单pdf生成_快递鸟电子面单接口打印实现代码
  14. Xbrowser远程登录Ubuntu闪退问题的解决方案
  15. 图片提取文字很神奇?试试三步实现OCR!
  16. royer推挽自激电路
  17. java将占位符替换成指定字符串的函数
  18. BIM轻量化技术解析
  19. 京东云使用密钥登陆云主机
  20. 解读ConnectBot-1 telnet、ssh常识

热门文章

  1. 拆箱装箱有什么作用JAVA_基础--最简单明了的拆箱装箱解释,带实例
  2. interface接口_Java程序设计--接口interface(笔记)
  3. with open as f用法_UE4精品教程 | C++Tuple元组的详细用法
  4. 过程生产excel_生产型企业,自己开发管理系统,该如何选型?
  5. 手部骨骼特征 数据集_速写局部精讲之手部比例、肌肉、特征解析
  6. python基础教程慕课_Python基础教程(6)--抽象
  7. nuxt打包路劲问题_简述Nuxt.js
  8. 为什么不用php做系统吗,IT行业:为什么大部分人都不认可php语言呢?
  9. 虚拟主机如何创建svn服务器,虚拟主机搭建svn
  10. duri oracle 连接字符串_Oracle连接字符串大全