关于重写函数的一些方法
2021.10.13
#define 可以 用一个标识符来表示一个字符串,因此称其宏定义。类似如下用法:
#define ios ios::sync_with_stdio(false)
#define endl '\n'
但是使用其改写某些函数时就会出现问题,比如如下代码
#define max(a, b) a > b ? a : b
在比较
max(max(2,1),3)
时就会出现问题而导致结果不正确。
此时可以加括号来解决一部分问题:
#define max(a,b) ((a)>(b)?(a):(b))
但是不能解决全部问题。其没有考虑类型的情况。
因此使用如下代码:
template<typename T1, typename T2>
constexpr auto max(T1 a, T2 b) { return a > b ? a : b; }
使用模板类重写函数,时间要比上面#define慢很多,但是比原有的max函数快不少。(图中 61 m s 61ms 61ms)
t e m p l a t e template template为模板类,用于接受不同类型的参数, c o n s t e x p r constexpr constexpr类似与 c o n s t const const,但不同于 c o n s t const const,只指向 c o n s t const const的最上一层。
例如memset这类的函数,若重写为
template<typename T1, typename T2>
const auto memset(T1 a, T2 b) { memset(a, b, sizeof a); }
就会有如下情形发生:
因此只能使用#define进行重写