模板函数与类模板
来源:互联网 发布:java 读取ini 编辑:程序博客网 时间:2024/05/16 00:28
#include <iostream>#include <vector>using namespace std;int max_f(int a, int b){ std::cout << "int max_f(int a, int b)" << std::endl; return a > b ? a : b;}template <typename T> T max_f(T a, T b){ std::cout << "template <typename T> T max_f(T a, T b)" << std::endl; return a > b ? a : b;}//模板函数char*的特化template <> char* max_f(char* a, char* b){ std::cout << "template <> char* max_f(char* a, char* b)" << std::endl; return strcmp(a,b) > 0 ? a : b;}template <typename RT, typename T1, typename T2> RT fun(T1 a, T2 b){ std::cout << "template <typename RT, typename T1, typename T2> RT fun(T1 a, T2 b)" << std::endl; return a > b ? a : b;}//===============================================================================//非类型模板参数只能是整形或者指向外部链接对象的指针 http://blog.csdn.net/sophia_sy/article/details/1507077template <typename T = int, int szie = 10> //默认参数class A{public: class subA{}; typename A::subA v1; //定义一个subA对象 subA subv; //定义一个subA对象 typedef typename A::subA sv1; //定义subA的类型 sv1 v; //定义一个sv1对象 template <typename T2> A<T>& operator=(const T2& t2) { std::cout << "A<T>& operator=(const T2& t2)" << std::endl; return *this; }};template <char const* name>class B{public: void f() { std::cout << name << std::endl; }};//char const s[] = "hello"; //error,s是常量,不是变量,所以没有内部、外部链接属性extern char const s[] = "hello";int main(){ char* p = "a"; char* q = "b"; //非模板函数优先级高于模板函数 模板函数不支持类型的自动转换 max_f(3,5); //int max_f(int a, int b) max_f<>(3,5); //template <typename T> T max_f(T a, T b) 由参数推导类型 max_f(3,5.2); //int max_f(int a, int b) max_f('a',5); //int max_f(int a, int b) max_f('a','b'); //template <typename T> T max_f(T a, T b) max_f(p,q); //template <> char* max_f(char* a, char* b) max_f("a","abc"); //const char* //template <typename T> T max_f(T a, T b) fun<float>(1,2); //fun<RT,T1,T2>, T1 T2 可以从参数表中推导 std::cout << "===========================================" << std::endl; A<> a; //使用模板A的默认参数类型 a = 1; //template <typename T2> A<T>& operator=(const T2& t2) std::cout << "===========================================" << std::endl; B<s> b; b.f(); //hello system("pause"); return 0;}