为什么要自己封装个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
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/270418
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!