模板
函数重载
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| int getLargestNumber(const vector<int>& vect) { int largestNumber{ vect.at(0) }; for (auto& val : vect) { if (val > largestNumber) largestNumber = val; } return largestNumber; }
double getLargestNumber(const vector<double>& vect) { double largestNumber{ vect.at(0) }; for (auto& val : vect) { if (val > largestNumber) largestNumber = val; } return largestNumber; }
int main() { vector<int> vect1{ 1,2,3,4,5,9,8,7,6,0 }; vector<double> vect2{ 1.1,2.2,3.3,4.4,9.9,8.8,7.7,6.6 }; auto result1 = getLargestNumber(vect1); auto result2 = getLargestNumber(vect2); cout << result1 << endl; cout << result2 << endl; auto c = getchar(); }
|
- 同名函数但函数参数不同或参数类型不同
- C++ 会根据传入的参数调用对应的函数
函数模板
使用模板来编写处理多种数据类型的通用函数,而不是写多个函数重载
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| template <typename T> T add(T a, T b) { return a + b; }
int main() { int result1 = add(5, 3); double result2 = add(2.5, 3.5);
std::cout << "Result 1: " << result1 << std::endl; std::cout << "Result 2: " << result2 << std::endl;
return 0; }
|
//模板类:键值对
template
class KeyValPair
{
public:
KeyValPair(string k, T v) :key{ k }, value{ v } { };
string key;//键
T value; //值
};
//模板类:键值字典
template
class Dic
{
public:
Dic()=default;
void PushBack(KeyValPair val) {
vect.push_back(val);
}
auto operator[](string key) {
for (KeyValPair& pair:vect)
{
if (pair.key == key) {
return pair.value;
}
}
}
vector<KeyValPair> vect;
};
//使用模板类
int main() {
Dic dic;
// { “test1” , 123 } 直接用于创建KeyValPair对象
dic.PushBack({ “test1” , 123 });
dic.PushBack({ “test2” , 456 });
dic.PushBack({ “test3” , 789 });
cout << dic[“test2”] << endl; //输出456
auto c = getchar();
}
1 2 3 4 5 6 7 8 9
| ### 模板别名
```c++ //模板别名 using myType = MyTemplateType<int,string,double,char>;
myType obj; //...
|
模板参数
非类型模板参数不代表一个具体的数据类型,而是一个常量表达式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| #include <iostream> using namespace std;
template <typename T = int,T WIDTH = 123> class MyType { public: MyType() = default; T getWidth() { return WIDTH; } };
int main() { MyType obj; cout << obj.getWidth() << endl; MyType<double,456.1> obj2; cout << obj2.getWidth() << endl; auto c = getchar(); }
|
总结
- 以模板为基础的泛型也是一种多态的表现形式,但面向对象的多态是运行时多态,而泛型多态是编译期多态
- 对于模板类,编译器应该要能同时访问到模板的定义和实现,把模板的定义和实现全部放在头文件中