Hua*_*ang 2 c++ stdvector stdset c++17 std-variant
我有一个类型为或std::vector的std::variant元素。如果迭代元素的类型为 ,我想遍历这个向量和一个额外的项目。但是,似乎不允许在运行时查询索引。我怎样才能做到这一点?intstd::set<int>insertstd::set<int>
#include <variant>
#include <set>
#include <vector>
int main()
{
using Variants = std::variant<int, std::set<int>>;
std::vector<Variants> var_vec;
var_vec.push_back(999);
std::set<int> a = {0,1,2};
var_vec.push_back(a);
for (int i = 0; i < var_vec.size(); ++i)
{
// if the element var_vec[i] is of type std::set<int>
if (var_vec[i].index() == 1) var_vec[i].insert(888); // !ERROR! How to achieve this?
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
错误信息:
error: '__gnu_cxx::__alloc_traits<std::allocator<std::variant<int, std::set<int, std::less<int>, std::allocator<int> > > >, std::variant<int, std::set<int, std::less<int>, std::allocator<int> > > >::value_type' {aka 'class std::variant<int, std::set<int, std::less<int>, std::allocator<int> > >'} has no member named 'insert'
Run Code Online (Sandbox Code Playgroud)
index()在运行时调用没有任何问题,这种情况一直发生。真正的问题是:
var_vec[i].insert(888);
Run Code Online (Sandbox Code Playgroud)
var_vec[i]是一个std::variant。它没有称为 的方法insert()。
std::get<1>(var_vec[i]).insert(888);
Run Code Online (Sandbox Code Playgroud)
这为您提供了变体的集合,这将很高兴让您insert()有所作为。
这种整体方法的一个问题是,如果您出于某种原因想要修改您的变体,而这std::set不再是它的第二个选择,那么由于某种原因,上述所有逻辑都会再次中断。
您应该考虑使用std::holds_alternative, 而不是index(), 并使用类型std::get而不是索引,这将自动适应这种变化。