将元组转换为对。

3

有一个教育任务:编写一个模板函数, 接收任意std::tuple和内部的两个索引,并返回包含给定std::tuple相应索引处元素的std::pair

示例:

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"

翻译如下:

编写类似以下内容:

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));
}

然而出现了一个错误:
r: missing template arguments before ‘t’
auto to_pair(std::tuple t) -> decltype(std::make_pair(get<I>t, get<J>t))
                        ^

我在这里做错了什么,正确的语法是什么?
1个回答

5

std::tuple是一个模板类,因此不存在std::tuple,只有std::tuple<T, ...>。在您的情况下,t的类型是std::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));
}

std::tuple<T, ...> - 非常简单,谢谢,这个可行! - Aleksey Kontsevich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接