繁体   English   中英

如何将元组插入地图?

[英]How to insert a tuple into a map?

我正在写一个zip_iterator (为了好玩/学术/“哦,没有Boost是邪恶的,我们不想要它”的原因)我设想的一个用例是将两个vector一起压缩到另一个容器中,例如map 这在Clang上使用libc ++,但在MSVC2017和GCC 7.2上意外失败。 我把问题减少到了这段代码:

#include <iterator>
#include <map>
#include <tuple>

int main()
{
    std::map<int, double> map;

    auto it = std::inserter(map, map.begin());

    it = std::make_tuple(1, 1.);
}

这里Clang的工作演示, 这里GCC的破解演示和MSVC

这使我优雅地使用我的zip_iterator不起作用:

std::copy(zip_begin(ints, doubles), zip_end(ints, doubles), std::inserter(int_double_map, int_double_map.begin()));

请参阅此处获取该 zip_iterator 的完整代码 ,因为我现在拥有它。

我希望这可以工作,因为元组是一个2对元素,一个应该可以从另一个构造。 如果我试图找到一个泛型对(元组)构造函数,或者一个元组来配对隐式转换,我似乎找不到一个。 那么问题就变成了:为什么它对Clang / libc ++起作用呢?

注意:我不能只在那里推一个std::make_pair ,因为它是通用代码。

一种可能的解决方法是特殊情况下使用双迭代器来生成一pair而不是tuple 看起来很难看,但可行。 如果可能的话,我宁愿避免这样做。

一个应该是另一个可以构建的

  • std::pair<T, U>没有定义来自std::tuple<T, U>任何隐式构造函数。

  • 类似地, std::tuple<T, U>没有为std::pair<T, U>定义任何隐式转换运算符。

我认为Clang(libc ++)在这里是不正确的,并且GCC和MSVC是正确的。


看起来很难看,但可行

这不是太糟糕:

template <typename... Ts> 
auto make_thing(Ts&&... xs)
{
    if constexpr(sizeof...(xs) == 2)) 
    { 
        return std::make_pair(std::forward<Ts>(xs)...);
    }
    else
    {
        return std::make_tuple(std::forward<Ts>(xs)...);
    } 
}

在C ++ 14中,您可以使用specialization / enable_ifstatic_if替换if constexpr

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM