我一直在实施自己的std::map
版本,以从内部更深入地了解事物的工作方式。在实施std::map::emplace()
时,我遇到了一个问题。
所以,我的函数签名如下:
template <typename Key, typename Value>
template <typename ... Args1, typename ... Args2>
std::pair<typename Map<Key, Value>::Iterator, bool> Map<Key, Value>::emplace(
std::piecewise_construct_t pwc,
std::tuple<Args1...> first_args,
std::tuple<Args2...> second_args);
在实际嵌入之前,我确实需要从first_args
构造键,以便比较树中的键。我已经尝试了一些方法,但是无法找出正确的方法。据我了解,它看起来应该像这样:
Key k(std::get<sizeof...(Args1)>(std::forward<Args1>(first_args));
问题在于,对于元组的每个元素,std::get()
应该收到一个不同的数字作为其模板参数(以便将元组的正确元素传递到正确的位置)。
我已经看到人们通过将大小作为模板参数并传递std::index_sequence
作为参数之一来解决此问题,但是std::map::emplace()
没有任何这种方法,因此应该有一种方法不用这个就可以实现嵌入。
先谢谢您。任何建议将不胜感激!
答案 0 :(得分:1)
我已经看到人们通过将大小作为模板参数并将std :: index_sequence作为参数之一来解决此问题,但是std :: map :: emplace()没有这种方法,因此应该有一种无需这种方式即可实现嵌入的方法。
std::map::emplace()
确实没有收到std::index_sequence
,但是我不知道是否在内部创建std::index_sequence
并调用辅助函数来正确管理元组。 / p>
换句话说,您可以编写如下内容
Key k { make_object_from_tuple<Key>(first_arg, std::index_sequence_for<Args1...>{}) };
在make_object_from_tuple()
内,您可以使用std::index_sequence
从元组中提取元素并构造Key
对象。
换句话说:如Kerndog73所建议,您可以将std::make_from_tuple_impl()
实现复制到this page中。
如果您不想开发新功能,可以使用std::pair
中的分段构造器。
没什么让您构造std::pair<Key, Value>
的:如果您要先构造Key
,并且仅在必要时构造下一个Value
,则可以在std::pair<Key, int>
之前构造然后是std::pair<Value, int>
之后。
我的意思是...您可以在没有Key
的情况下创建Value
std::tuple<int> ti{0};
Key k { std::pair<Key, int>{std::piecewise_construct_t, first_args, ti).first };
,然后,仅在需要时Value
Value v { std::pair<Value, int>{std::piecewise_construct_t, second_args, ti).first };