将带有可变参数模板参数的 std::tuple 作为其元素类型传递给另一个函数作为参数列表

Pass std::tuple with variadic template parameter as its elements type to another function as a list of parameters

我一直在实施我的 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() 没有任何这种方法,所以应该有一个没有这个的实现安置的方法。

提前谢谢你。任何建议将不胜感激!

I've seen people solve this problem by having size as template parameter and passing std::index_sequence as one of parameters, but std::map::emplace() does not have any of this approach, so there should be a way to do implement emplacing without this.

确实 std::map::emplace() 没有收到 std::index_sequence,但我不知道是否在内部创建 std::index_sequence 并调用辅助函数来正确管理元组.

也就是说,你可以这样写

Key k { make_object_from_tuple<Key>(first_arg, std::index_sequence_for<Args1...>{}) };

make_object_from_tuple() 中,您可以使用 std::index_sequence 从元组中提取元素并构造 Key 对象。

换句话说:根据 Kerndog73 的建议,您可以在 this page.

中复制 std::make_from_tuple_impl() 实现

如果您不想开发新功能,可以使用 std::pair 中的分段构造函数。

没有什么可以强制你构造一个 std::pair<Key, Value>:如果你想先构造一个 Key,只有在必要时,再构造一个 Value,你可以在一个 [=24] 之前构造=] 之后(在这种情况下)a std::pair<Value, int>.

我的意思是...您可以在没有 Value

的情况下创建 Key
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 };