网站首页 > 文章精选 正文
类模板 std::variant 表示一个类型安全的联合体。 std::variant 的一个实例在任意时刻要么保有其一个可选类型之一的值,要么在错误情况下无值。
std::visit应用观览器 vis 到 variant 变量组 vars 。
std::visit参数:
vis | 接受每个 variant 的每个可能可选项的可调用 (Callable) 对象 |
vars | 传递给观览器的 variant 列表 |
例子1
- 观察器vis针对variant每个可选项必须有之对应的函数,不能缺。
- 返回值是观察器共同返回的类型,不能不一致。
#include <iostream>
#include <variant>
struct Apple { };
struct Orange { };
struct Banana { };
struct Pear { };
template<class... Ts> struct overload : Ts... { using Ts::operator()...; };
template<class... Ts> overload(Ts...) -> overload<Ts...>; // C++20不在需要
int main() {
std::variant<Apple, Orange, Banana, Pear> package = { Banana() };
auto result = std::visit(overload{
[](Apple& ) { std::cout << "Apple\n"; return 1;},
[](Orange& ) { std::cout << "Orange\n"; return 2;},
[](Banana& ) { std::cout << "Banana\n"; return 3;},
[](Pear& ) { std::cout << "Pear\n"; return 4;}
}, package);
std::cout << result << std::endl;
}
例子2
观察器的是多个variant选项笛卡尔积
#include <iostream>
#include <variant>
struct Apple { };
struct Orange { };
struct Banana { };
struct Pear { };
struct Light { };
struct Heavy { };
template<class... Ts> struct overload : Ts... { using Ts::operator()...; };
template<class... Ts> overload(Ts...) -> overload<Ts...>; // C++20不在需要
int main() {
std::variant<Apple, Orange> package1 = { Orange() };
std::variant<Light, Heavy> package2 = { Light() };
auto result = std::visit(overload{
[](Apple&, Light&) { std::cout << "Light Apple\n"; return 1;},
[](Orange&, Light&) { std::cout << "Light Orange\n"; return 2;},
[](Apple&, Heavy&) { std::cout << "Heavy Apple\n"; return 3;},
[](Orange&, Heavy&) { std::cout << "Heavy Orange\n"; return 4;}
}, package1, package2);
std::cout << result << std::endl;
}
https://wandbox.org/nojs/gcc-head
https://wandbox.org/nojs/clang-head
https://wandbox.org/permlink/wyeJ1TNulMwEM6QJ
https://wandbox.org/permlink/qpn9gVjb4vzKja0I
猜你喜欢
- 2025-06-28 程序员C/C++你不得不看的27个优化建议
- 2025-06-28 [c++面试题]数据库中的outer join, 你了解吗?
- 2025-06-28 开机弹出 C++ Runtime Library: Assertion failed窗口解决方法
- 2025-06-28 C++调用外部程序传递用户名密码登录
- 2025-06-28 C/C++编程推荐学习顺序和书籍(c++编程需要学多久)
- 2025-06-28 c/c++如何避免头文件被多次包含(c语言避免头文件重复定义)
- 2025-06-28 C++程序编译之谜(一)——多文件编译的奇怪现象
- 2025-06-28 C++20 香不香?从四大新特性看起(c++20支持)
- 2025-06-28 C++知识点 13:extern“C”(c语言extern的用法)
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)
- mysql数据库面试题 (57)