讨论C++模板

讨论C++模板

C++支持了函数重载,通过函数名相同,参数列表不同来构成函数重载,以达到方便程序员调用。但还是没有改变代码大量重复的问题。

函数重载和泛型编程

  • 使用函数重载来解决不同数据类型的相加操作。
c++ 复制代码
int Add(int a, int b) {
    return a + b;
}
double Add(double a, double b) {
    return a + b;
}
  • 编译器会根据实参不同的数据类型,去调用相应的函数,但这样还是造成了代码冗余、重复。C++进而引入泛型编程的概念,即使用一个"模具",使用不同的"材料"添加,已达到不同的效果。

模板

模板是泛型编程的基础。

分类

函数模板

函数模板代表了一个函数家族,函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。

语法

c++ 复制代码
template<typename T1, typename T2,.....>
返回值类型 函数名(参数列表){}
c++ 复制代码
template<typename T>
T Add(const T& a, const T& b) {
  	return a + b;
}
  • typename可以用class替代。

原理

函数模板并不是函数本身,在编译阶段,编译器根据传入的实参类型推演生成对应的类型函数。

函数模板的实例化

用不同类型的参数使用函数模板时,称为函数模板的实例化。

隐式实例化

编译器自己根据实参的不同类型推演模板参数的实际类型。

c++ 复制代码
template<class T>
T Add(const T& a, const T& b) {
    return a + b;
}

int main() {
    Add(1, 2); // 直接推演出int
    Add(3.14, 5.56); // 直接推演出double
    Add(3.14,  (double)1); // 如果无法直接推演,可强转数据类型。
    return 0;
}
显示实例化

在函数名后使用<>指定模板参数实际类型。

c++ 复制代码
template<class T>
T Add(const T& a, const T& b) {
    return a + b;
}

int main() {
    int a = 10;
    double b = 3.75;
    Add<int>(a, b);
    return 0;
}

匹配原则

  • 一个非模板函数可以和一个同名的函数模板同时存在。
  • 非模板函数和函数模板同名,且其他条件都相同,会优先调用非模板函数,如果模板可以产生更好的匹配,则选择模板。
c++ 复制代码
int Add(const int&a, const int& b) {
    return a + b;
}

template<class T1, class T2>
T2 Add(const T1& a, const T2& b) {
    return a + b;
}

int main() {
    Add(10, 3.14);
    Add(10, 20);
    return 0;
}
  • 模板函数不允许自动类型转换,但普通函数可以进行自动类型转换。

类模板

语法

c++ 复制代码
template<class T>
class 类模板名 {
  	// 类内成员定义
};

类模板的实例化

  • 类模板的实例化必须要在类模板名后加<>,将实例化类型放在<>中。
  • 类模板名不是真正的类,实例化的结果才是真正的类。
c++ 复制代码
std::vector<int> v
相关推荐
王老师青少年编程3 小时前
信奥赛C++提高组csp-s之搜索进阶(搜索剪枝案例实践1)
c++·csp·高频考点·信奥赛·提高组·搜索剪枝·小木棍
王老师青少年编程6 小时前
信奥赛C++提高组csp-s之搜索进阶(搜索剪枝核心思想 )
c++·dfs·csp·信奥赛·搜索剪枝·搜索优化
一拳一个呆瓜6 小时前
【STL】使用 C++ 标准库标头
c++·stl
王老师青少年编程6 小时前
信奥赛C++提高组csp-s之搜索进阶(搜索剪枝案例实践2)
c++·信奥赛·csp-s·提高组·搜索剪枝·生日蛋糕·最优性剪枝
c++之路6 小时前
C++ 设计模式全总结
java·c++·设计模式
c238567 小时前
c/c++中的多态(上)
开发语言·c++
彷徨而立7 小时前
【C++】介绍 std::ifstream 输入文件流
开发语言·c++
MC皮蛋侠客7 小时前
C++17 多线程系列(十):多线程性能优化——从测量到调优
c++·多线程
程序大视界7 小时前
【C++ 从基础到项目实战】C++(六):拷贝控制——浅拷贝与深拷贝,兼谈智能指针
开发语言·c++·cpp
代码中介商9 小时前
C++四大设计模式:单例、工厂、观察者、策略
java·c++·设计模式