C++之模板特化

来源:互联网 发布:网络推广威客 编辑:程序博客网 时间:2024/06/01 07:57

关于C++中的模板,一直只会用最基础的部分。今天从网上找了一个文档,总结如下

函数模板特化

其实就是针对一个函数模板,定义一个特定类型的函数,函数模板更加具有通用性。
#include <stdio.h>#include <string.h>template <typename T>int compare( T const & l, T const & r){return l < r ? -1 : ( l == r ? 0 : 1);}/*如果程序由多个文件构成,模板特化的声明必须在使用该特化的每个文件中出现。*/template <>int compare<const char *>(const char * const & l,  const char * const & r);template <>int compare<const char *>(const char * const & l,  const char * const & r){return strcmp(l, r);}intmain(int argc, char * argv[]){printf("%d\n", compare("aaa", "abc"));printf("%d\n", compare(1    , 2    ));printf("%d\n", compare(3.0  , 1.0  ));return 0;}

类模板特化

#include <stdio.h>#include <stdlib.h>#include <string>#include <vector>#include <assert.h>  #include <queue>using namespace std;template <class T>class Queue{private:queue<T> qu;public:void push(T const & elem){qu.push(elem);}void pop(){qu.pop();}T  & back(){return qu.back();}T  & front(){return qu.front();}ssize_t size(){return qu.size();}};template <>class Queue<const char *>{private:queue<std::string> qu;public:void push(const char * const & elem){qu.push(elem);}void pop(){qu.pop();}std::string & back(){return qu.back();}std::string  & front(){return qu.front();}ssize_t size(){return qu.size();}};intmain(int argc, char * argv[]){Queue<const char *> q;q.push("hello");q.push("china");return 0;}


特化成员而不特化类

#include <stdio.h>#include <stdlib.h>#include <string>#include <vector>#include <assert.h>  #include <queue>#include <string.h>using namespace std;template <class T>class Queue{private:queue<T> qu;public:void push(T const & elem){qu.push(elem);}void pop(){qu.pop();}T  & back(){return qu.back();}T  & front(){return qu.front();}ssize_t size(){return qu.size();}};template <>void Queue<const char *>::push(const char * const & src){char * buf = new char[strlen(src) + 1];memcpy(buf, src, strlen(src));buf[strlen(src)] = 0;qu.push(buf);}template <>void Queue<const char *>::pop(){const char * buf = qu.front();qu.pop();delete[] buf;}int main(int argc, char * argv[]){Queue<const char *> q;q.push("Hello,world");q.push("China Linux");printf("%s\n", q.front());q.pop();printf("%s\n", q.front());q.pop();return 0;}


类模板的部分特化

#include <stdio.h>#include <stdlib.h>#include <string>#include <vector>#include <assert.h>  #include <queue>#include <string.h>using namespace std;template<typename T1, typename T2, typename T3>class SomeClass{public:void func(){printf("SomeClass<T1, T2, T3>::func()\n");}};template<typename T1>class SomeClass<T1, int, std::string>{public:void func(){printf("SomeClass<T1, int, std::string>::func()\n");}};int main(int argc, char * argv[]){SomeClass<int, int, std::string> s1;s1.func();SomeClass<int, int, int> s2;s2.func();return 0;}


0 0