28、元组的遍历
const_cast
只能用于指针或引用类型,而不能用于基本类型如 int
。
在的代码中,试图将 i
转换为 const_cast<int>(i)
,这是不合法的。
可以使用模板函数来获取元组中的元素,而不是使用 const_cast
。以下是修正后的代码:
#include <tuple>
#include <iostream>auto get_student(int id)
{// 返回类型被推断为 std::tuple<double, char, std::string>if (id == 0)return std::make_tuple(3.8, 'A', "张三");if (id == 1)return std::make_tuple(2.9, 'C', "李四");if (id == 2)return std::make_tuple(1.7, 'D', "王五");return std::make_tuple(0.0, 'D', "null");// 如果只写 0 会出现推断错误, 编译失败
}template <typename T>
auto tuple_len(T &tpl) {return std::tuple_size<T>::value;
}template <std::size_t I = 0, typename... Tp>
void print_tuple(const std::tuple<Tp...>& t)
{if constexpr (I < sizeof...(Tp)) {std::cout << std::get<I>(t) << " ";print_tuple<I + 1, Tp...>(t);}
}int main()
{auto student = get_student(0);std::cout << "ID: 0, "<< "GPA: " << std::get<0>(student) << ", "<< "成绩: " << std::get<1>(student) << ", "<< "姓名: " << std::get<2>(student) << '\n';std::cout << "学生信息: ";print_tuple(student);std::cout << '\n';return 0;
}/*
ID: 0, GPA: 3.8, 成绩: A, 姓名: 张三
====================================
3.8 A 张三
*/
在这个修正后的代码中,print_tuple
函数使用递归模板来打印元组中的所有元素。这样就避免了使用 const_cast
,并且可以正确地打印元组中的所有元素。