C++ STL系列-02.泛型入門
????????C++中的泛型編程主要通過模板(template)實現。模板允許我們編寫與類型無關的代碼,是一種將類型作為參數進行編程的方式。在C++中,模板分為函數模板和類模板。
1. 函數模板
????????函數模板允許我們定義一個函數,它可以接受多種類型的參數。例如,我們可以寫一個比較兩個值大小的函數模板,而不是為每種類型都寫一個重載函數。
#include<iostream>
template<typename T>
T max(T a, T b) {return a > b ? a : b;
}
int main(int argc, char*argv[]) {int a = 1, b = 5;std::cout << max(a, b) << std::endl;char c = 'a', d = 'h';std::cout << max(c, d) << std::endl;return 0;
}
????????在上面的代碼中,template 告訴編譯器這是一個模板,T 是一個占位符類型。當我們調用 max 函數時,編譯器會根據傳入的參數類型自動生成特定類型的函數。
2. 類模板
????????類模板允許我們定義一個類,其成員的類型可以由模板參數指定。例如,我們可以定義一個簡單的Box類,用來存儲任意類型的值。
#include<iostream>
template<typename T>
class Box {
private:T content;
public:Box(T value) : content(value) {} // 賦值給 contentT getValue() {return content;}
};
//使用類模板時,我們需要在創建對象時指定類型:
int main(int argc, char*argv[]) {Box<int>a = 1;Box<std::string>b("hello");std::cout << a.getValue() << std::endl;std::cout << b.getValue() << std::endl;return 0;
}
3.可變參數模板
????????C++11引入了可變參數模板,允許模板接受可變數量的參數。例如,我們可以定義一個函數,它可以接受任意數量的參數并打印它們:
#include<iostream>
// 基本可變參數模板示例:打印所有參數
// 遞歸終止函數
void print() {std::cout << std::endl;
}// 遞歸展開參數包
template<typename T, typename... Args>
void print(T first, Args... args) {std::cout << first << " ";print(args...);
}
int main(int argc, char*argv[]) {print(1,2,'g',"hello");return 0;
}
C++17引入了折疊表達式,可以更簡潔地展開參數包。
#include<iostream>
template<typename... Args>
void print(Args... args) {(std::cout << ... << args) << std::endl;
}
int main(int argc, char*argv[]) {print(1,2,'g',"hello");return 0;
}
使用折疊表達式求和
#include<iostream>
template<typename... Args>
auto sum(Args... args) {return (args + ...);
}
int main(int argc, char*argv[]) {std::cout << sum(1,2,3,4,5) << std::endl;return 0;
}
使用折疊表達式遍歷加空格
#include<iostream>
template<typename ...Args>
void print(Args... args) {((std::cout << args << ' '), ...) << std::endl;
}
int main(int argc, char*argv[]) {print(1,2,3,4,5);return 0;
}
將參數包存入vector
#include<iostream>
#include<vector>
template<typename T, typename... Args>
std::vector<T> make_vector(Args... args) {return std::vector<T>{static_cast<T>(args)...};
}
int main(int argc, char*argv[]) {auto vec = make_vector<int>(1, 2, 3, 4, 5);std::cout << "Vector: ";for (auto v : vec) {std::cout << v << " ";}return 0;
}