【C++编程】特例化、偏特化、全特化

偏特化、全特化

注意: 我们只能部分特例化(偏特化)类模板,而不能部分特例化函数模板。

1. 定义函数模板特例化:

#include <iostream>
#include <string.h>

template <typename T>
T Max(T t1, T t2) {
    return (t1 > t2) ? t1 : t2;
}

template <>
const char *Max(const char *s1, const char *s2) {
    return (strcmp(s1, s2) > 0) ? s1 : s2;
}

int main()
{
    // 隐式调用实例:int Max<int>(int,int)
    int i = Max(10, 5);

    // 显式调用特化版本:const char* Max<const char*>(const char*,const char*)
    const char *p = Max<const char *>("very", "good");
    cout << "i:" << i << endl;
    cout << "p:" << p << endl;
}

 

2. 定义类模板特例化

#include <iostream>
using namespace std;
 
namespace templateTest {
  template<typename T>  // 模版泛化
  class iterator_traits {
  public:
    iterator_traits() { cout << "模版泛化" << endl; }
    ~iterator_traits() {}
  };

  template<typename T> // 偏特化
  class iterator_traits<T*> {
  public:
    iterator_traits() { cout << "模版偏特化,特化常规指针" << endl; }
    ~iterator_traits() {};
  };

  template<typename T> //偏特化
  class iterator_traits<const T*> {
  public:
    iterator_traits() { cout << "模版偏特化,特化const指针" << endl; }
    ~iterator_traits() {}
  };

  template<> //全特化
  class iterator_traits<int> {
  public:
    iterator_traits() { cout << "模版全特化int类型" << endl; }
    ~iterator_traits() {}
  };
};
 
int main()
{
  templateTest::iterator_traits<int> t1;         //  模版全特化int类型
  templateTest::iterator_traits<float> t2;       //  模版泛化
  templateTest::iterator_traits<int*> t3;        //  模版偏特化,特化常规指针
  templateTest::iterator_traits<const int*> t4;  //  模版偏特化,特化const指针
}

 

posted @ 2018-12-12 19:15  苏格拉底的落泪  阅读(170)  评论(0编辑  收藏  举报