在解析协议的时候,需要将一个大端字序的整数,转成小端字序,比如内存中有[1,2,3,4]四个字节,我们需要翻转成[4,3,2,1]。
(u8是8位无符号整数类型)
void reverse(u8 *a, u8 *b)
{
for(int i =0;i<4;i++){
a[i] = b[3-i]
}
}
void reverse(u8 *a, u8 *b)
{
*a = *b
*(a+1) = *(b-1)
*(a+2) = *(b-2)
*(a+3) = *(b-3)
}
循环可以处理位数不定的情况,硬编码写的累,但执行效率高一些,如何让鱼和熊掌兼得呢?
这时候C++的模版函数大显身手了,请看如下代码
template <int N>
inline void reverse(u8 *a, u8 *b)
{
*a = *b;
reverse<N - 1>(a + 1, b - 1);
}
template <>
inline void reverse<1>(u8 *a, u8 *b)
{
*a = *b;
}
模版参数除了常见的替换类型以外,还有这种传递一个整数常量的方式。当我们调用这个reverse函数的时候,编译器会在编译阶段展开函数,由于内部我们递归调用了reverse,编译器会递归的展开这个函数。
这里我们用到了模板函数的特化,编译器会在特定条件(这里是N=1)的情况下使用特化的模板函数,从而终止递归调用。
函数展开后,相当于:(伪代码)
void reverse(u8 *a, u8 *b)
{
*a = *b
*(a+1) = *(b-1)
*(a+2) = *(b-2)
*(a+3) = *(b-3)
……
*(a+n) = *(b-n)
}