我有以下代码(play with example)。它检查variant的基础值是什么,并使用get接收此基础值。如您所见,代码变得非常重复。
#include <variant>
#include <string>
#include <iostream>
#include <vector>
int main()
{
std::variant<int, double, std::string> v;
// v holds a string
v = "hi there!";
switch(v.index()) {
case 0:
{ // brackets to avoid cross initialization
int i = std::get<int>(v);
// handle int
}
break;
case 1:
{
double d = std::get<double>(v);
// handle double
}
break;
case 2:
{
std::string s = std::get<std::string>(v);
// handle string
}
break;
}
}
问题:是否有某种方法可以将变量的索引作为constexpr
变量获取?我想做这样的事情:
// what I would like to do
// auto val_of_v = std::get<v.index()>(v);
// Error: template argument deduction/substitution failed
// in 'constexpr' expansion of v<...>::index()
仅变体是constexpr本身:
constexpr std::variant<int, double> v{24};
auto a = std::get<v.index()>(v);
否则,该信息只能在运行时知道。
您正在寻找的是std::visit
,这是为您实现该切换的库工具:
std::visit