欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > IT业 > C++模版初阶

C++模版初阶

2024/10/25 15:29:07 来源:https://blog.csdn.net/2301_80395066/article/details/139539309  浏览:    关键词:C++模版初阶

一、泛型编程

如何实现一个通用的交换函数?

void swap(int& a, int& b)
{int tem = a;a = b;b = tem;
}
void swap(double& a, double& b)
{double tem = a;a = b;b = tem;
}
void swap(char& a, char& b)
{char tem = a;a = b;b = tem;
}

使用函数重载虽然可以实现,但是有一个不好的地方:

 重载的函数仅仅是类型不同,代码复用率比较低,只要有新类型出现时,就需要用户自己增加对应的函数

二、函数模版

函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本

原理

在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用。

template<typename T>
void swap(T& a, T& b)
{T tem = a;a = b;b = tem;
}
int main()
{int a = 4;int b = 1;swap(a, b);double c = 1.1, d = 2.2;swap(c, d);return 0;
}

1. 隐式实例化:让编译器根据实参推演模板参数的实际类型

template<typename T1,typename T2>
auto  Add(const T1& left, const T2& right)
{cout << "auto  Add(T1 & left, T2 & right)" << endl;return left + right;
}
template<typename T>
T  Add(const T& left, const & right)
{cout << "T  Add(T& left, T& right)" << endl;return left + right;
}
int main()
{int a = 0, b = 1;double c = 1.1, d = 2.2;Add(a, b);Add(c, d);Add(a, c);cout<<Add((double)a, (int)c)<<endl;return 0;
}

2.显式实例化::在函数名后的<>中指定模板参数的实际类型,不再推演参数

cout <<( Add<double, int>(a, c) )<< endl;
cout << (Add<double, double>(a, c)) << endl;

函数参数带const是因为可能有强制类型转换产生临时变量,需要用const接收 

3.模板参数的匹配原则 

1、都有的情况,优先匹配普通函数+参数类型匹配
2、没有普通函数,优先函数模版+参数类型匹配3、只有一个,类型转换一下也能用,也可以匹配调用
//专门处理int的加法函数
int Add(int a, int b)
{cout << "int Add(int a, int b)" << endl;return a + b;
}
//通用加法函数
template<typename T1,typename T2>
auto  Add(const T1& left, const T2& right)
{cout << "auto  Add(T1 & left, T2 & right)" << endl;return left + right;
}
template<typename T>
T  Add(T& left, T& right)
{cout << "T  Add(T& left, T& right)" << endl;return left + right;
}
int main()
{int a = 0, b = 1;double c = 1.1, d = 2.2;Add(a, b);Add(c, d);Add(a, c);return 0;
}

三、类模版

template<typename T>
class Stack
{
public:Stack(size_t capacity = 4){_array = (T*)malloc(sizeof(T) * capacity);if (nullptr == _array){perror("malloc申请空间失败");return;}_capacity = capacity;_size = 0;}void Push(const T& data);
private:T* _array;size_t _capacity;size_t _size;
};
template<class T>
void Stack<T>::Push(const T& data)
{_array[_size] = data;++_size;
}

类模版的实例化:

Stack<int> st1;   Stack<double> st2;

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com