テンプレートの部分特殊化

http://www.geocities.jp/ky_webid/cpp/language/037.html

テンプレートの特殊化の、部分特別バージョンが存在します。

どういったものかというと、例えば同じ型は型でも、ポインタ型の場合の時だけ別処理にするみたいな感じです。

#include <iostream>
using namespace std;

template<class T>
class CSample {
public:
    CSample(T t) : m_t(t) {}
    T Get() { return m_t; }
private:
    T m_t;
};

template<class T>
class CSample<T*> { // 任意のポインタ型の場合だけ
public:
    CSample() : m_t(200) {}
    int Get() { return m_t; }
private:
    int m_t;
};

int main () {
    CSample<int>  obj1(100);
    CSample<int*> obj2;
    
    cout << obj1.Get() << endl;
    cout << obj2.Get() << endl;
    
    return 0;
}
$ main
100
200

面白いですね。ポインタの時だけ違う処理とかは確かにありえそうです。

ただしこのテンプレートの部分特殊化はVC6等の古いコンパイラではコンパイルできないそうです。

注意が必要ですね。