将元组转换为对

Ale*_*ich 3 c++ tuples std c++11

有教育任务:编写模板函数,其中包含任意std::tuple和 2 个索引并返回std::pair,包含std::tuple具有对应索引的给定元素。

例子:

auto t = std::make_tuple(0, 3.5, "Hello");
std::pair<double, char const *> p = to_pair<1,2>(t);
// p contains 3.5 and "Hello"
Run Code Online (Sandbox Code Playgroud)

写了这样的东西:

template<int I, int J>
auto to_pair(std::tuple t) -> decltype(std::make_pair(std::get<I>(t), std::get<J>(t))) {
    return std::make_pair(std::get<I>(t), std::get<J>(t));
}
Run Code Online (Sandbox Code Playgroud)

但是得到了一个错误:

r: missing template arguments before ‘t’
auto to_pair(std::tuple t) -> decltype(std::make_pair(get<I>t, get<J>t))
                        ^
Run Code Online (Sandbox Code Playgroud)

我做错了什么,这里的正确语法是什么?

Dar*_*uuk 5

std::tuple是一个模板类,所以没有std::tuple,只有std::tuple<T, ...>。在您的情况下,类型tstd::tuple<int, double, char const *>

此外,您在std::get没有参数的情况下调用(缺少大括号)。

你快到了,这个函数应该是这样的:

template<int I, int J, class... T>
auto to_pair(std::tuple<T...> t)
    -> decltype(std::make_pair(std::get<I>(t), std::get<J>(t))) {
  return std::make_pair(std::get<I>(t), std::get<J>(t));
}
Run Code Online (Sandbox Code Playgroud)