template specialization and different return type

ふと、特殊化されたテンプレートごとに戻り値をかえたくなった。ようするにこういうこと。

template<>
int foo<short>();

template<>
long foo<int>();

ところが、これは一般化されたテンプレートを宣言できないのでうまくいかない。template parameter と戻り値が一緒なら話は簡単なのだが。

template<typename T>
T foo();

で、しばらく考えて出てきたのが以下。

template<typename T>
struct TypeHolder;

template<short>
struct TypeHolder
{
    typedef short ValueType;
};

template<int>
struct TypeHolder
{
    typedef long ValueType;
};

template<typename T>
typename TypeHolder<T>::ValueType foo();

template<>
int foo<short>();

template<>
long foo<int>();

template って奥が深いですね。まぁ、なんか常套手段な気がするけど。