[英]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.