簡體   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