现代C++编程实战(3)
Unicode
ASCII:美国信息交换标准代码
Windows扩展以及各种乱七八糟的扩展:ISO-xxx等
Unicode
0x0~0x10FFFF一共
- UTF-32:编码直接映射
- UTF-16:
- UTF-8:1~4个字节变长
C++对Unicode的支持
- c++11引入了char16_t char32_t代表了utf-16, utf-8
- c++20引入char8_t
- u16string, u32string, u8string
- 字面量,u8"hi", u"hi", U"hi"
Unix和Windows对Unicode的支持
- unix utf-8
- windows,一直用char,取决于Windows系统的语言,英文是Windows-1252, 中文是GBK
编译器多态
类型检查只能在实例化的时候做
如何让库支持我们自己的操作
- 添加代码,针对那个类型做重载
- 对于函数模板,可以直接针对那个类型进行重载。
- 对于类模板和函数模板,可以针对那个类型进行特化。
编译期能做什么
C++的模板是图灵完全的,可以执行任何计算
用模板计算阶乘
template<int n>
struct factorial{
static const int value = n * factorial<n-1>::value;
}
template<>
struct factorial<0>{
static const int value = 1;
}
编译器编程的核心在于:把计算转换成类型推导
IF
// 一个通用的模板
template<bool cond, typename THEN, typename ELSE>
struct IF;
// 针对true和false的偏例化
template<typename THEN, typename ELSE>
struct<true, THEN, ELSE>{
typedef THEN type;
}
template<typename THEN, typename ELSE>
struct<false, THEN, ELSE>{
typedef ELSE type;
}
编译器类型推导
模板元编程
看不懂....以后再说吧
constexpr
将某些运行期计算放到编译期
constexpr int sqr(int n) {
return n * n;
}
int main() {
const int n = sqr(3);
int a[n]; // 只有sqr被constexpr修饰才能编译通过
}
局部静态const成员不是内联的,需要在CPP文件中定义
但是constexpr就是内联的
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通