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

时间:2019-06-25 03:52:35

标签: c++ c++14 variadic-templates stdtuple

我一直在实施自己的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()没有任何这种方法,因此应该有一种方法不用这个就可以实现嵌入。

先谢谢您。任何建议将不胜感激!

1 个答案:

答案 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 };