我有这样的课:
template <class T>
class Foo;
我想有一个专业
template <>
class Foo < size_t N >;
但这不适合我:
我的主要是这样的:
Foo<int> p; // OK
Foo<15> p2; // fails to compile
我错过了什么?
你不能——你的模板总是采用一个类型参数。专业化只能比这更特别,但不能不同(因此得名)。
也许您可以使用辅助模板来存储值信息:
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
or typename T
)、表示非类型的参数(例如int N
or size_t N
)和表示模板的参数(例如template <class T2> class T
)。
为您的模板定义的参数属于第一类(类型参数),但特化假定为第二类(非类型参数)。那是行不通的。特化的参数必须与主模板定义的相应参数类型相同。
您可以使用中间类专门化该类:
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;
}