C++函数模板和宏 - 自用

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;
}
  1. 函数模板调用时,如果利用自动类型推导,不会发生隐式类型转换
  2. 如果利用显示指定类型的方式,可以发生隐式类型转换
  3. 自动类型推导,必须推导出一致的数据类型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

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值