C++函数模板和宏
使用宏或模板来定义函数能够减少重复代码,但函数需要匹配适当的签名
函数模板
定义函数模板:
template <typename T>
T func(T arg1, T arg2, ...)
{
// 函数体
}
例子:使用函数模板实现返回两数之间的最大值
#include <iostream>
template <typename T>
T max(T a, T b) {
return a > b ? a : b;
}
/**
* template关键字表示接下来的代码是一个函数模板的定义
* T是一种类型参数的通用名字
* max即函数模板的名称。
* 上述函数模板接受两个参数 a,b
* 参数和函数返回值的数据类型均为 T
* 函数体为比较大小,返回两个参数中的最大值
* 使用函数模板时,用指定的类型替换函数模板中的模板参数即可
*/
int main() {
int a = max(2, 1);
//max(2,1)为函数模板实例化,这里采用编译器自动推导T的数据类型
double b = max<double>(5.5, 1.2);
//这里为显式指定
std::cout << a << std::endl << b;
// int a = max(2.1, 1);
// 传入的参数类型不同,会出现编译错误,因为模板无法确定参数的通用类型。
return 0;
}
- 函数模板调用时,如果利用自动类型推导,不会发生隐式类型转换
- 如果利用显示指定类型的方式,可以发生隐式类型转换
- 自动类型推导,必须推导出一致的数据类型T,才可以使用
宏
在C++源程序中允许用一个标识符来代表一个字符文本,称为宏,标识符为宏名。
宏是由宏定义命令事先定义的。预处理时,对程序中所有后续的宏名实例(称为宏引用),预处理器都用字符文本去替换,称为宏替换或宏展开。
宏定义通常用于定义程序中的符号常量,类型别名,运算式代换和语句代换等,其命令为#define,分为不带参数的宏定义和带参数的宏定义。
即在预编译时,将宏定义的 宏名 查找替换为 字符文本。
不带参的宏定义语法为:#define 宏名 字符串
带参数的宏定义的命令形式为: #define 宏名(参数表) 字符文本
,例如#define max(a,b) (((a) >(b))?(a) : (b))
带参数的宏的引用形式为:宏名(引用参数表)
,例如L=max(x-y,x+y)
- 宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束
- 一个宏的作用范围是从定义位置开始到#undef命令结束
贴一段代码作为示例:
#include <iostream>
// 定义模板函数 SelectFunc
template <typename T, typename Func>
void SelectFunc(const T& a, const T& b, T& out, Func func) {
out = func(a, b);
}
// 定义 MaxFunc 函数对象
struct MaxFunc {
template <typename T>
T operator()(const T& a, const T& b) const{
return a > b ? a : b;
}
};
// 定义 MinFunc 函数对象
struct MinFunc {
template <typename T>
T operator()(const T& a, const T& b) const{
return a < b ? a : b;
}
};
// 宏定义生成具体函数
#define SELECT_FUNC(name, Func) \
template <typename T> \
void name(const T& a, const T& b, T& out) { \
SelectFunc(a, b, out, Func()); \
}
// 使用宏定义生成 max 和 min 函数
SELECT_FUNC(max, MaxFunc)
SELECT_FUNC(min, MinFunc)
// 取消宏定义
#undef SELECT_FUNC
//测试
int main() {
int a = 10, b = 20, out_max, out_min;
max(a, b, out_max);
min(a, b, out_min);
std::cout << "Max: " << out_max << "\n";
std::cout << "Min: " << out_min << "\n";
return 0;
}
详解可见:
模板函数 : https://blog.csdn.net/jax_ton/article/details/130852872
宏: http://www.tup.tsinghua.edu.cn/upload/books/yz/098776-01.pdf