[英]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_if
或static_if
替換if constexpr
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.