我有一个这样的课程:
template <class T>
class Foo;
我想要专业化
template <>
class Foo < size_t N >;
但这并不适合我:
我的主要是:
Foo<int> p; // OK
Foo<15> p2; // fails to compile
我错过了什么?
答案 0 :(得分:5)
你不能 - 你的模板总是带有一个类型参数。专业化只能比这更特殊,但不能不同(因此名称)。
也许您可以使用辅助模板来存储价值信息:
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;
答案 1 :(得分:3)
有三种模板参数:表示类型的参数(例如class T
或typename T
),表示非类型的参数(例如int N
或{{1} }),以及代表模板的那些(例如size_t N
)。
为模板定义的参数是第一种(类型参数),但专门化采用第二种(非类型参数)。这不起作用。专业化的参数必须与主模板定义的相应参数相同。
答案 2 :(得分: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;
}