1. enum class

enum class与普通enum的区别:

  1. enum class跟整数没有任何隐式转换
  2. enum class中的枚举值有独立的作用域,不会与全局名字发生命令冲突

2. tuple

  1. 固定大小
  2. 包含一组异质数据

例子:

using my_tuple = tuple<int, string, string>; // 声明
my_tuple vn = {1, "one", "un"}; // 定义
get<2>(vn) = "une"; // 读写
tuple_size_v(vn) // 获取tuple的大小
tuple_cat // 拼接

3. tie

利用tie快速实现比较操作:

例子:

struct Xxx{
    int a;
    int b;
    int c;
};

bool operator<(const Xxx& l, const Xxx & r)
{
    return tie(l.a, l.b, l.c) < tie(r.a, r.b, r.c);
}

4. 结构化绑定

例子1:

multimap<string, int>::iterator lower, upper;
std::tie(lower, upper) = multimap.equal_range("four");

在以上代码中,L1必须写出完整的类型名,非常哆嗦,且存在“未初始化”的隐患。
L2使用std::tie对多个变量批量赋值。
multimap.equal_range返回pair类型。

例子2:

auto[lower, upper] = multimap.euqal_range("four");

在例子2中,实现了与例子1相同的功能,但是不需要啰嗦的类型说明,也不存在“未初始化”的隐患。

5. 时间测量代码示例

auto t1 = chrono::steady_clock::now();
... // 一些操作
auto t2 = chrono::steady_clock::now();

cout<<chrono::duration_cast<chrono::nanosecends>(t2-t1).count()<<"ns has elapsed\n";

6. any

  1. 可以存放任何类型
  2. 可以记住所存放的值的类型
  3. 类型转换安全
  4. any对象存放在堆中

例子1:

any obj = string("Hello world");
cout<<obj.type.name()<<":"<<any_cast<string>(obj);
obj = 42;
cout<<obj.type.name()<<":"<<any_cast<int>(obj);

说明: obj可以存放任意类型,例子中先存放了string,然后又存放了int。
obj.type.name()表明可以记住所存放的类型。
obj在使用前应做类型转换。

例子2:

any obj = 42;
auto ptr = any_cast<int>(&obj);

说明:
如果obj存在的是int,取obj的地址并转换为int类型指针时,会得到obj的地址。
如果obj存在的不是int,取obj的地址并转换为int类型指针时,会得到nullptr。

例子3:

any obj = 42;
cout<<any_cast<string>(obj)<<endl;

obj存在的是int,不是string,强制转换为string类型时会抛异常。

6.1. any的适用场景

  1. 回调函数的参数

为了回调函数的兼容性,常使用void参数。
可以使用any代替void
,可以更安全,且能自动管理对象的生命周期。

  1. 异质容器

vector

  1. 必须能够通过上下文推导出any的类型

  2. 实际使用中很少见

7. optional

8. variant

9. string_view

例子:

string generate_greeting(string_view name)
{
    string result("Hi, ");
    result.append(name.data(), name.size());
    return reuslt;
}

说明:
函数generate_greeting的入参可以是string或string_view,可自动执行类型转换,且无复制。
string_view类型对象的操作方式与string相同,但只能“访问”和“缩小”对象的内容,不能修改或增加内容。
string_view对象拷贝的本质是指针和长度的复制,没有内容的复制。
string_view要求其指向的对象一直存在。

results matching ""

    No results matching ""