0%

C++17新特性:多类型变量std::variant

  1. 需求
  2. 实现

需求

假设有如下两个结构体

1
2
3
4
5
6
7
8
9
10
struct A {
std::string name;
int a;
double b;
};

struct B {
std::string name;
double time;
};

两个结构体表示同一个对象,但这个对象可能在name不同时具有不同的参数;

现在要用一个数组将其管理起来,如何实现?

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <variant>

std::variant<A, B, int, double, float> param;

A a;
a.name = "A";
a.a = 1;
a.b = 2.2;
param = a;

B b;
b.name = "B";
b.time = 678;
param = b;
  • std::variant<A, B, int, double, float>声明的对象可以直接将A/B/int/double/float的值赋给它
  • param.index()可以获取类型下标,即在模板列表中类型的位置,从0开始
  • 通过std::get<>(param)可以获取对应类型的参数,模板里面可以是下标,也可以是类型:
    • std::get<0>(param),数字0只能直接写,不能是变量
    • std::get<A>(param)