现代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 @ 2022-08-09 19:38  Destiny233  阅读(91)  评论(0)    收藏  举报