私はこのようなクラスを持っています:
template <class T>
class Foo;
専門にしたい
template <>
class Foo < size_t N >;
しかし、それは私のためにコンパイルされません:
私のメインは次のようなものです:
Foo<int> p; // OK
Foo<15> p2; // fails to compile
私は何が欠けていますか?
できません-テンプレートは常に1つの型パラメーターを取ります。スペシャライゼーションはそれよりも特別なものにすることができますが、違いはありません(そのため名前が付けられています)。
補助テンプレートを使用して、値情報を格納できる場合があります。
template <typename T, T Val> struct ValueWrapper { };
template <typename T> struct Foo;
templaet <typename T, T Val> struct Foo<ValueWrapper<T, Val>>
{
typedef T type;
static type const value = Val;
// ...
};
使用法:
Foo<char> x;
Foo<ValueWrapper<int, 15>> y;
class T
テンプレートパラメータには、タイプ(egまたはtypename T
)を表すもの、非タイプ(egint N
またはsize_t N
)を表すもの、およびテンプレート(eg )を表すものの3種類がありますtemplate <class T2> class T
。
テンプレートに定義されたパラメーターは第1の種類(タイプパラメーター)ですが、特殊化では第2の種類(非タイプパラメーター)を想定しています。それはうまくいきません。特殊化のパラメーターは、プライマリテンプレート定義の対応するパラメーターと同じ種類である必要があります。
中間クラスを使用してクラスを特殊化できます。
template <class T>
class Foo
{
public:
static const bool is_number = false;
};
template <size_t number>
struct ic
{};
template <size_t N>
class Foo < class ic<N> >
{
public:
static const bool is_number = true;
size_t getN() const
{
return N;
}
};
int main()
{
Foo<int> p;
Foo<ic<15> > p2;
cout << "p.is_number = " << p.is_number << endl;
cout << "p2.is_number = " << p2.is_number << endl;
cout << "p2.getN() = " << p2.getN() << endl;
return 0;
}