C++编译期串

 日志串( *文件名, 行号){
  串视 s(文件名);
   位置=s.右找('/');
  =(位置==串视::几位置)?文件名:s.子串(位置+1);
  串流 ss;
  ss<<<<":"<<行号<<":";
   ss.();
}


 s=日志串(__文件__,____);
输出<<"运行时日志"<<s<<"\n";//main.cpp:12
 静日志串( 编译时串&文件名, 编译时串&行号){
   位置=文件名.右找('/');
   .子串(位置+1)+":"+行号+":";
}
< , N>
 固定串{...};

 测试串(){
  常式  s1="你好"_fs;//FixedString<符, 5>
  常式  s=s1+""+"世界";
  //多了个常式.
  静断(s=="你好世界"_fs);
  静断(s.子串(4)=="世界"_fs);
}

//成员
< , N>
 固定串{
   数据_[N+1];// +1 是为了放字符串终止符'0'
   大小_; // 这个size是不包含字符串终止符的长度, size_ <= N.
  //...
};

//构造
< , N>
 固定串{
   数据_[N+1];// +1 是为了放字符串终止符'0'
   大小_; // 这个size是不包含字符串终止符的长度, size_ <= N.
:
  <,...>
  常式 固定串(&, 大小,引序<...>,
     位置=0,=几位置)无异
    :数据_{(<(大小-位置)&&<?[+位置]:(0))...,(0)},
    大小_{最小(大小-位置,)}{}
//序列,逗号表达式,列表初化
  常式  大小() 无异{ 大小_;}
数据_{(<(大小-位置)&&<?[+位置]:(0))...,(0)}//关键
//逗号表达式展开.也可以考虑用`折叠`表达式.

 测试构造(){
  常式  *="你好";
  常式 固定串<,4>固定串(,4,造引序<4>{});
  //构造串,要计算串长度,还要`造序`.
  静断(固定串.大小()==4);//ok
}

常式  ="你好"_fs;//FixedString<符, 4>
//要这样提供
常式  1=造固定串("你好");//或这样.
静断(==1);
  //支持符数组
//加几个构造函数的重载.
  < M,=型名 允许如<(M-1<=N)>::类型>
  常式 固定串( (&)[M])无异
    :固定串{,M-1,造引序<M-1>{}}{}

  //指针符*
  常式 固定串( *,)无异
    :固定串(,,造引序<N>{}){}
//有了上面,就可用编译期串常量来构建了
//仅对林操,微软不行,下面为辅助函数.
< ,...C>
常式 固定串<,的大小...(C)>符号""_fs()无异{
    a[]={C...,(0)};
  {a,的大小...(C)};//调用支持符*的构造函数
}

< , N>
常式 固定串<,N-1>造固定串( (&a)[N])无异{
  {a};//调用支持符数组的构造函数
}
//`+/=`操作符
  <,,...>
  常式 固定串(&, 左大小,&,
     合适大小,引序<...>)无异
    :数据_{符在<>(,左大小,,合适大小,)...,(0)},大小_{左大小+合适大小}{}
    //生成新`固定串`.
< ,,>
常式  符在(&, 左计数,&, 右计数, i)无异{//返回哪个符.前半用左,后半用右
   i<左计数?[i]
    :i<(左计数+右计数)?[i-左计数]:(0);
}
//实现连接
< ,,,...>
 常式 固定串<,的大小...()>连接(
  &, 左计数,&, 右计数,
  引序<...>)无异{
  {,左计数,,右计数,};
}
//+符号.
< M> 常式 固定串<,N+M-1>符号+(
     固定串&a, (&b)[M])无异{
     连接<>(a.数据_,a.大小_,b,M-1,造引序<N+M-1>{});
}//这个N是从`构`模板里面来的.

< M> 常式 固定串<,N+M-1>符号+(
   (&a)[M], 固定串&b)无异{
     连接<>(a,M-1,b.数据_,b.大小_,造引序<N+M-1>{});
}//两个+符号
//==操作符.
<,>
常式  相等(&, 左大小,&,
   合适大小)无异{
  (左大小!=合适大小) ;
  ( i=0;i<左大小;++i){
    ([i]!=[i]) ;
  }
   ;
}

< , A, B>
常式  符号==( 固定串<,A>&a,
   固定串<,B>&b)无异{
   相等(a,a.大小(),b,b.大小());
}

< , A, B>
常式  符号!=( 固定串<,A>&a, 固定串<,B>&b){
  !(a==b);
}//不等
 测试连接(){
  常式  s1=造固定串("你好");
  常式  s=s1+","+"世界";
  常式  s2=造固定串("你好,世界");
  静断(s==s2);
}
//用常式实现算法
  常式  大小() 无异{ 大小_;}
  常式  长度() 无异{ 大小_;}
  常式  空的() 无异{ 0==大小_;}
   常式  容量()无异{ N;}
   常式  最大大小()无异{ N;}

  常式 &( i)无异(){ 数据_[i];}
  常式  &( i) 无异(){ 数据_[i];}
  常式 &符号[]( i)无异{ 数据_[i];}
  常式  &符号[]( i) 无异{ 数据_[i];}

  常式 &()无异{(*)[0];}
  常式  &() 无异{(*)[0];}
  常式 &()无异{ 数据_[大小_-1];}
  常式  &() 无异{ 数据_[大小_-1];}
  常式  清理()无异{
    数据_[0]=(0);大小_=0;
  }
  常式  压后( c)无异(){
    //检查溢出(1, N - size_);
    数据_[大小_]=c;
    数据_[++大小_]=(0);
  }

  常式  弹后()无异(){
    //检查溢出(1, size_);
    --大小_;数据_[大小_]=(0);
  }

  < M>
  常式 固定串&附加( 固定串<,M>&)无异(){
     附加(,0,.大小_);
  }

  < M>
  常式 固定串&附加( 固定串<,M>&, 位置,)无异(){
    ( i=0;i<;++i){
      数据_[大小_+i]=.数据_[位置+i];
    }
    大小_+=;
    数据_[大小_]=(0);
    *;
  }

  常式 固定串&附加( *)无异(){
     附加(,串长());
  }

  常式 固定串&附加( *,)无异(){
    ( i=0;i<;++i){
      数据_[大小_+i]=[i];
    }
    大小_+=;
    数据_[大小_]=(0);
    *;
  }

  常式 ( c){
    ( i=0;i<N;++i){
      (数据_[i]==c){
         i;
      }
    }

     几位置;
  }

  常式  右找( c){
    ( i=N-1;i>=0;--i){
      (数据_[i]==c) i;
    }

     几位置;
  }

  常式 固定串 子串( 位置) 无异(){
    {*,位置};
  }

  常式 固定串 子串( 位置,) 无异(){
    {*,位置,};
  }

  常式  复制(*,, 位置)
    无异(){
    ( i=0;i<;++i){
      (i+位置==大小_){
         大小_;
      }[i]=数据_[i+位置];
    }
    ;
  }
//至串,到串视
  符号 基串<>() 无异(){
     基串<>{开始(),()};
  }

  基串<>至串() 无异(){
     基串<>{开始(),()};
  }
  常式 符号 基本串视<>(){
     基本串视<>{开始(),大小()};
  }
  基串<>到串视() 无异(){
     基本串视<>{开始(),()};
  }
//测试代码
 测试至串(){
  常式  =造固定串("你好");
   s=;
  串视 s1=;
  断定(s=="你好"s);
  断定(s1=="你好"sv);
}
< N, M>
常式  静日志串( (&文件名)[N], (&行号)[M]){
   =造固定串(文件名);
   位置=.右找('/');
   .子串(位置+1)+":"+行号+":";
}

#定义 (x)#x
#定义 至串(x)(x)

常式  s=静日志串(__文件__,至串(____));
输出<<s.数据()<<"\n";//main.cpp:20:
性能比较
 测试日志串(){
  域计时器 计时器("哈哈");
  ( i=0;i<10000;++i){
    日志串(__文件__,____);
  }
}

#定义 (x)#x
#定义 至串(x)(x)

 测试静日志串(){
  域计时器 计时器("新的");
  ( i=0;i<10000;++i){
    静日志串(__文件__,至串(____));
  }
}

 (){
  测试日志串();
  测试静日志串();
  测试静日志串();
  测试日志串();
}
posted @   zjh6  阅读(15)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示