使用std::variant<int, bool>
,我可以调用std::get<0>(var)
来获取变量中第一个类型的值 - int
。
那么,如何在boost::variant
中实现这一功能呢?boost::get<>
似乎只支持按类型获取,而不支持按索引获取,并且我发现文档非常难以理解。
使用std::variant<int, bool>
,我可以调用std::get<0>(var)
来获取变量中第一个类型的值 - int
。
那么,如何在boost::variant
中实现这一功能呢?boost::get<>
似乎只支持按类型获取,而不支持按索引获取,并且我发现文档非常难以理解。
这似乎不在boost中包含。
但是,在这个答案的帮助下,我们可以轻松地自己实现:
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);
}
查看演示。
如果需要,指针重载当然也可以类比添加。
boost::variant
中... - onqtamindex()
(在boost中为which()
)和get()
非常有用。 - Alexis Wilke
<variant>
... 所以只能用 C++14(也是最新版的 boost)。 - onqtam