从 boost::variant 中逐个索引获取项目,就像使用 std::variant 一样
Get item by index from boost::variant like it's possible with std::variant
有了std::variant<int, bool>
,我可以调用std::get<0>(var)
来获取变体中的值,因为它是第一种类型 -int
.
我怎样才能用boost::variant
做到这一点?boost::get<>
似乎只支持按类型而不是按索引获取,我发现文档很难理解。
这似乎不包括在提升中。
但是,借助这个答案,我们可以简单地扮演自己的角色:
template<int N, typename... Ts> using NthTypeOf =
typename std::tuple_element<N, std::tuple<Ts...>>::type;
template<int N, typename... Ts>
auto &get(boost::variant<Ts...> &v) {
using target = NthTypeOf<N, Ts...>;
return boost::get<target>(v);
}
template<int N, typename... Ts>
auto &get(const boost::variant<Ts...> &v) {
using target = NthTypeOf<N, Ts...>;
return boost::get<target>(v);
}
int main () {
boost::variant<int, double> v = 3.2;
std::cout << get<1>(v);
}
现场观看。
如果需要,当然可以类似地添加指针重载。
相关文章:
- 在template中使用std::variant的template函数
- 使用 std::variant<...时调用 BaseState 函数而不是派生函数>
- 为 std::variant 提供一个运算符 ==
- 如何使用 std::variant 打印地图键/值?
- 在缺少函数重载时抛出异常,并带有 std::variant 而不是编译时错误
- 在 std::tuple 上使用 std::variant 的问题
- 如何访问存储在 std::variant 中的类的方法
- 更改其类型后,丢失对 std::variant 对象的引用
- std::visit and std::variant usage
- std::variant vs指向C++中异构容器基类的指针
- std::variant<>::get() 不能使用 Apple LLVM 10.0 编译
- C++如何乘以包含 std::variant 元素的向量的迭代器?正在执行迭代器类型的转换?
- 有没有办法避免为 std::variant 类成员中的所有类型编写构造函数?
- 按索引设置 std::variant 的值
- 在 std::variant 中按类型获取索引
- 与传统的多态处理相比,使用 std::variant 有什么优势?
- 无法引用该函数" std:: variant <_Types...> operator =",因为此函数已被删除
- 为什么 std::variant 找不到运算符<() 当与比较类不在同一命名空间中时
- 使输出流式处理运算符适用于 boost::variant<std::vector<int>、int、double 的正确方法是什么>
- 如何迭代 boost::variant<std::vector<int>, std::vector<String>>?