C++17 · 类型安全分派

先选成员,再绑定对象;先查类型,再处理值

两个实验分别观察“未绑定的类成员选择器”和“带活动类型标签的多选一值”。改变输入后,代码路径与结果会同步更新。

成员指针:同一选择器,应用到不同对象

double Metric::* field 只选择类中的成员;它没有绑定具体 Metric 对象。

1. 选择数据成员指针
edgelatency: 42throughput: 880
corelatency: 18throughput: 1250
当前声明double Metric::* field = &Metric::latency;
Metric edge{42, 880};
Metric core{18, 1250};
Metric* pointer = &core;

edge.*field;
pointer->*field;
std::invoke(field, core);
对象
object.*field
pointer->*field
std::invoke
edge
42
42
42
core
18
18
18

三列相等,因为它们都把同一个成员选择器应用到指定对象。成员指针不是整数偏移,也不是某个对象中成员的已绑定地址。

std::variant:活动备选决定受检查路径

Event = variant<monostate, int, string> 在任一时刻只持有一个活动备选。

1. 构造当前 Event
2. 选择访问方式
Event 当前索引0 · monostate
0: monostate
显式空状态
1: int
204
2: string
"ready"
std::get_if<int>(&event) 先核对活动类型

受检查结果:nullptr

当前不是 int,因此返回空指针;没有读取错误的备选。

if (const int* value = std::get_if<int>(&event)) {
  // 当前备选是 int,value 可安全解引用
} else {
  // 当前不是 int
}