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
,并且可以正確地打印元組中的所有元素。