现代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就是内联的

posted @   Destiny233  阅读(84)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示