我有一个std::variant
可能重复的类型,我想增加变体的活动索引。
这是一个演示我想要做的事情的例子:
template <typename... Ts>
bool update_variant(std::variant<Ts>& v, std::tuple<work_generator<Ts>>& gen) {
return visit_with_index([&]<size_t Index /* the active index */>(auto& e) {
if (e.done()) {
// we are done with e
constexpr size_t next_index = Index + 1;
if constexpr (next_index == sizeof...(Ts)) {
// no more other work to do
return false;
} else {
// still have other work to do so we move on to the next variant alternative
v.emplace(
std::in_place_index_t<next_index>{},
std::get<next_index>(gen).create_worker()
);
return true;
}
} else {
// do some work on e, so e gets closer to the done state
e.do_some_work();
return true;
}
}, v);
}
为了实现这一点,我似乎需要类似于visit_with_index
上面的东西,它给我当前索引作为编译时值。
除了编写我自己的visit_with_index
上述版本(实际上是编写我自己的版本)之外std::visit
,有没有更简单的方法来实现我想要的,而无需通过索引执行多次查找?
我会“直接”
visit
在索引上使用。第一的
然后
演示
如果您只关心单次访问,那么 Boost.Mp11
mp_with_index
已经是您想要的:这里对于某些来说
I
是一个,因此可以直接使用。integral_constant<size_t, V>
V
std::get<I>(x)
从内部来看,
mp_with_index<N>(i, f)
基本上是从到的switch (i)
所有值的总和。0
N - 1