関数テンプレートを部分的に特殊化することはできません。
1つの代替方法は、それをクラステンプレートの静的メンバー関数(またはあなたの場合は単なる値!)として定義し、次に…のような通常の関数テンプレートラッパーを提供することです。
#include <type_traits>
template< class T1, class T2, class T3 >
struct Blah {};
namespace detail {
template< class T1, class T2, class T3 >
struct IsHomogenous { static bool const yes = false; };
template< class T >
struct IsHomogenous< T, T, T > { static bool const yes = true; };
} // namespace detail
template< class T1, class T2, class T3 >
bool isHomogenous( Blah< T1, T2, T3 > )
{
return detail::IsHomogenous< T1, T2, T3 >::yes;
}
#include <iostream>
int main()
{
using namespace std;
wcout << boolalpha
<< isHomogenous( Blah< double, char, void >() ) << " "
<< isHomogenous( Blah< int, int, int >() )
<< endl;
}
もう1つの方法は、C++11を使用することですstd::is_same
。
#include <type_traits>
template< class T1, class T2, class T3 >
struct Blah {};
template< class T1, class T2, class T3 >
bool isHomogenous( Blah< T1, T2, T3 > )
{
using std::is_same;
return is_same< T1, T2 >::value && is_same< T2, T3 >::value;
}
#include <iostream>
int main()
{
using namespace std;
wcout << boolalpha
<< isHomogenous( Blah< double, char, void >() ) << " "
<< isHomogenous( Blah< int, int, int >() )
<< endl;
}