从boost::variant中通过索引获取元素,就像使用std::variant一样

6

使用std::variant<int, bool>,我可以调用std::get<0>(var)来获取变量中第一个类型的值 - int

那么,如何在boost::variant中实现这一功能呢?boost::get<>似乎只支持按类型获取,而不支持按索引获取,并且我发现文档非常难以理解。


好像你不能。 - Baum mit Augen
@BaummitAugen,有没有什么方法可以黑进去?也许可以用一些 mpl 的诡计? - onqtam
很可能是的。哪个标准? - Baum mit Augen
@BaummitAugen 我使用(几乎)最新版本的编译器 - 只有 emscripten 让我落后了 - 它的 libcxx 版本还没有 <variant> ... 所以只能用 C++14(也是最新版的 boost)。 - onqtam
1个回答

6

这似乎不在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);
}

查看演示

如果需要,指针重载当然也可以类比添加。


1
是的,我的错 - 只需使用auto就可以正确传播const。感谢您的答案!在我看来,这需要添加到boost::variant中... - onqtam
@onqtam 从未尝试过贡献代码,但我想你可以提交一个补丁。我不明白为什么他们会反对这个。 (不确定他们使用哪个标准,但在C++11中,这已经变得有点丑陋了,而我不确定如何在C++03中实现它。) - Baum mit Augen
@onqtam 我坚信,当您有按类型访问时,通过索引访问是一种彻底的反模式。 - Richard Hodges
@RichardHodges,在动态环境中,index()(在boost中为which())和get()非常有用。 - Alexis Wilke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接