実体定義でテンプレートの特殊化

ロベールのC++入門講座 13-13

テンプレートの特殊化にはクラス宣言で特殊化する方法と、実体定義で特殊化する方法があります。前者は以前テンプレートの部分特殊化 - (void*)Pないとにて勉強しました。

後者は今回勉強する内容になります。

実体定義でテンプレートの特殊化とありますが、そんなに難しい話ではないです。

以下の例を見てください。

#include <iostream>
using std::cout; using std::endl;

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

// 実体定義でテンプレートの特殊化
// intの時だけGetの戻り値にて100を足して返す
template <> int CSample<int>::Get () { return m_t + 100; }

int main () {
    CSample<int> obj(10);
    
    cout << obj.Get() << endl;
}
$ main
110

これは便利ですね。クラス宣言の特殊化の場合は、殆ど同じような実装だとしても全体をコピペして変更するしかなかったのですが、実態定義で特殊化する場合は本当に処理を変えたいものだけを対象に特殊化できるのでかなり便利だと思います。