[ C++で開発 ]

テンプレート

特殊化(特別バージョン)

メンバ関数の特殊化

テンプレートを特殊化することで、テンプレート型パラメータに特定の型が指定されたときの実装を別に提供することができます。

Alfa.h
#pragma once

class Alfa {
public:
    Alfa();
    ~Alfa();
    // 汎用な宣言
    template<typename T> int getFrom(T input) {
        return ++T;
    }
};

// 特別バージョンのテンプレートメンバ関数宣言
template<> int Alfa::getFrom<int>(int input);
template<> int Alfa::getFrom<double>(double input);

テンプレートメンバ関数の宣言と定義はクラス定義内で行います。
特別バージョンの(特殊化した)テンプレート関数は、クラスの外側でクラス名スコープを付けて宣言します。特別バージョンのテンプレート関数の実装は、.cpp側に記述します。

Alfa.cpp
#pragma once
#include "Alfa.h"

Alfa::Afla() {}

Alfa::~Alfa() {}

template<> int Alfa::getFrom<int>(int input) {
    return 1;
}

template<> int Alfa::getFrom<double>(double input) {
    return 2;
}