C++17 · 类型安全分派
先选成员,再绑定对象;先查类型,再处理值
两个实验分别观察“未绑定的类成员选择器”和“带活动类型标签的多选一值”。改变输入后,代码路径与结果会同步更新。
成员指针:同一选择器,应用到不同对象
double Metric::* field 只选择类中的成员;它没有绑定具体 Metric 对象。
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> 在任一时刻只持有一个活动备选。
0: monostate显式空状态
1: int204
2: string"ready"
std::get_if<int>(&event)
先核对活动类型
受检查结果:nullptr
当前不是 int,因此返回空指针;没有读取错误的备选。
- monostate → “no event”
- int → “status code: value”
- string → “message: value”
if (const int* value = std::get_if<int>(&event)) {
// 当前备选是 int,value 可安全解引用
} else {
// 当前不是 int
}