模板函数小结

一、用法举例

举个例子说明。

cpp 复制代码
#include <iostream>
using namespace std;

template <class T>//class也可以替换为typename
T Max(T a, T b)
{
	return a > b? a : b;
}

int main()
{
	//隐式调用
    cout << Max(1, 2) << endl;
    cout << Max("d", "b") << endl;
	//显式调用
	cout << Max<double>(1.1, 2.2) << endl;
	
    return 0;
}

输出结果是:

cpp 复制代码
2
d
2.2

注意2点:

①template 和template 是同义的。

②cout << Max(1.1, 2.2) << endl;是显式调用的写法。

二、声明和定义

在工程中,模板函数通常需要在头文件中同时声明和定义。原因是,模板函数在被调用时需要进行实例化(即把模板类替换成实际类),将模板函数的定义放在头文件中可以确保在每个使用该模板函数的源文件中都能够进行实例化并生成相应的代码。

如果将模板函数的定义移到源文件中,编译器在编译其他源文件时将无法看到完整的定义,导致无法进行实例化和生成代码,从而导致链接错误。因此,通常情况下,模板函数的定义应该与声明放在同一个头文件中。

如果非要将模板函数的定义移到源文件中,可以。下面是一个用C++代码的示例:

头文件 template_example.h:

cpp 复制代码
#ifndef TEMPLATE_EXAMPLE_H
#define TEMPLATE_EXAMPLE_H

template <typename T>
void templateFunction(T value);

#endif  // TEMPLATE_EXAMPLE_H

源文件 template_example.cpp:

cpp 复制代码
#include "template_example.h"
#include <iostream>

template <typename T>
void templateFunction(T value) {
    std::cout << "Template function called with value: " << value << std::endl;
}

// 显式实例化模板函数
template void templateFunction<int>(int);  // 实例化模板函数用于 int 类型
template void templateFunction<double>(double);  // 实例化模板函数用于 double 类型

// 更多的实例化语句可以根据需要添加

主文件 main.cpp:

cpp 复制代码
#include "template_example.h"

int main() {
    templateFunction(42);  // 调用针对 int 类型的模板函数
    templateFunction(3.14);  // 调用针对 double 类型的模板函数

    return 0;
}

在这个示例中,模板函数 templateFunction 的声明被放在头文件 template_example.h 中,并在源文件 template_example.cpp 中进行定义。在 template_example.cpp 中,通过显式实例化模板函数 templateFunction,分别为 int 和 double 类型提供了具体的模板参数。这样可以确保在编译时会生成对应的模板函数定义。在主文件 main.cpp 中,通过包含头文件 "template_example.h",可以在需要的地方调用模板函数。

需要注意的是,为了确保模板函数的实例化,源文件 template_example.cpp 需要被编译并链接到主文件中,以生成可执行程序。可以采取如下2种方法确保源文件 template_example.cpp 被编译并链接到主文件中:

①在构建系统中添加源文件:在构建系统(如CMake、Makefile等)中将 template_example.cpp 添加到源文件列表中,以便在编译时将其编译为目标文件,并与 main.cpp 进行链接。这样,在构建项目时,构建系统会自动处理源文件的编译和链接过程。

②在主文件中包含源文件:在 main.cpp 文件中加一行:

cpp 复制代码
#include  "template_example.cpp"

这样,编译器在编译 main.cpp 时会将两个文件的内容一起处理,从而将模板函数的定义包含在主文件中。这种方法适用于规模较小的项目,但在大型项目中可能会导致编译时间增加和代码结构混乱,因此不太常见。

相关推荐
键盘鼓手苏苏7 分钟前
Flutter for OpenHarmony: Flutter 三方库 ntp 精准同步鸿蒙设备系统时间(分布式协同授时利器)
android·分布式·算法·flutter·华为·中间件·harmonyos
福大大架构师每日一题10 分钟前
go-zero v1.10.0发布!全面支持Go 1.23、MCP SDK迁移、性能与稳定性双提升
开发语言·后端·golang
董董灿是个攻城狮14 分钟前
AI 视觉连载5:传统 CV 之均值滤波
算法
多恩Stone21 分钟前
【3D-AICG 系列-11】Trellis 2 的 Shape VAE 训练流程梳理
人工智能·pytorch·算法·3d·aigc
抓饼先生29 分钟前
iceoryx编译和验证
linux·c++·零拷贝·iceoryx
王老师青少年编程36 分钟前
2020年信奥赛C++提高组csp-s初赛真题及答案解析(阅读程序第2题)
c++·题解·真题·初赛·信奥赛·csp-s·提高组
五阿哥永琪1 小时前
1. 为什么java不能用is开头来做布尔值的参数名,会出现反序列化异常。
java·开发语言
lintax1 小时前
计算pi值-积分法
python·算法·计算π·积分法
逻极1 小时前
pytest 入门指南:Python 测试框架从零到一(2025 实战版)
开发语言·python·pytest
你的冰西瓜1 小时前
C++ STL算法——排序和相关操作
开发语言·c++·算法·stl