#include "stdafx.h"
#include <iostream>
#include <string>
#include <boost/algorithm/string/trim.hpp>
#include <boost/array.hpp>
class String
{
enum { STATIC_SIZE=30 };
std::string& str() { return reinterpret_cast<std::string&>(*a_); }
const std::string& str() const { return reinterpret_cast<const std::string&>(*a_); }
public:
template <int N>
String& Manipulate();
String(){
zero();
}
String(const char* s){
zero(); set_buff(s);
}
String(const String& rhs){
zero(); set_buff(rhs.c_str());
}
~String() throw(){
if (f_) reinterpret_cast<std::string*>(a_)->~basic_string();
}
String& operator=(const String& rhs){
set_buff(rhs.c_str());
return *this;
}
size_t size() const
{
if (f_) return str().size();
return strlen(a_);
}
const char* c_str() const{
if (f_){
return str().c_str();
}
else{
return a_;
}
}
friend std::ostream& operator<<(std::ostream& os, String& s){
if (s.f_){
os << s.str();
}
else{
os << s.a_;
}
return os;
}
private:
//初始化为空字符串
void zero(){
f_=0;
a_[0]=0;
}
//存入字符串
void set_buff(const char* s){
//已经升级为std::string了
if (f_){
str() = s;
}
else{
//字符串太长,应用std::string
if (strlen(s)>STATIC_SIZE){
new (a_) std::string(s);
f_=1;
}
else{
strcpy(a_,s);
}
}
}
//静态数组。当字符串比较小时,就直接存在这里。
//否则在这个数组上,placement new一个std::string
char a_[STATIC_SIZE+1];
char f_; //指示存储类型,动态 1 静态 0
};
//特化版本可以直接访问String的私有成员
template <>
String& String::Manipulate<1>(){
if (f_){
boost::algorithm::trim(str());
}
else{
std::string t = a_;
boost::algorithm::trim(t);
set_buff(t.c_str());
}
return *this;
}
//trim函数的简便写法
#define trim String::Manipulate<1>
int main()
{
for (int i=0;i<10000000;++i){
String s("123456789");
const char* str = s.c_str();
}
system("pause");
return 0;
}
学习笔记:CString封装
最新推荐文章于 2023-04-12 22:36:41 发布