从 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<>
似乎只支持按类型获取,不支持按索引获取,我发现文档很难理解。
这似乎不包含在 boost 中。
但是,在 this answer 的帮助下,我们可以简单地扮演自己的角色:
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);
}
看到了live.
如果需要,当然可以类似地添加指针重载。
使用 std::variant<int, bool>
我可以调用 std::get<0>(var)
来获取变体中的值,因为它是第一种类型 - int
.
如何使用 boost::variant
执行此操作? boost::get<>
似乎只支持按类型获取,不支持按索引获取,我发现文档很难理解。
这似乎不包含在 boost 中。
但是,在 this answer 的帮助下,我们可以简单地扮演自己的角色:
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);
}
看到了live.
如果需要,当然可以类似地添加指针重载。