エンジニアのソフトウェア的愛情

または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか

関数テンプレートの特殊化は、

部分特殊化ができないのであって、全部指定してやればできるのか!!
関数テンプレートは特殊化できないとずっと勘違いしていた。あぁ、恥ずかしい。

template<typename result_t, typename arg_t>
result_t hogehoge_cast(arg_t arg);

enum Foo { Foo1, Foo2, Foo3 };
enum Bar { Bar1, Bar2, Bar3 };

// 特殊化 … OK
template<>
Foo hogehoge_cast<Foo, Bar>(Bar bar)
{
    return static_cast<Foo>(bar);
}

// 特殊化 … OK
template<>
Bar hogehoge_cast<Bar, Foo>(Foo foo)
{
    return static_cast<Bar>(foo);
}

// 部分特殊化 … NG
template<typename T>
Bar hogehoge_cast<Bar, T>(T value)
{
    return static_cast<Bar>(value);
}