我不能添加一个指针变量(无论固定或静态的)像
template <> struct s<MyClass *obj > // ERROR
[...]
你可能有一个误解,在这里。如果您关心的是您希望提供指向用户定义类的实例的指针作为非类型模板参数,那么这与模板专业化无关。
特别是,考虑到你可以指定的一个指针类作为模板参数的全球例如,按款C++ 11标准的14.3.2/1:
模板参数的用于非类型的,非模板的模板参数应是以下之一:
- 用于整型或枚举类型的非类型模板参数,转换后的常量表达式 (5.19)的模板参数的类型;或
- 非类型模板参数的名称;或
- 一个常量表达式(5.19),其指定具有静态存储持续时间和 外部或内部联动或与外部或内部的键的功能,包括函数模板 和功能模板ID的对象的地址,但除了非静态类成员之外,表达(忽略括号)为 & id-表达式,除了如果名称引用函数或数组,则可以省略&,并且如果相应的模板参数是引用,则应当省略 ;或
[...]
这可能是你所试图实现:
struct MyClass { };
MyClass c;
template<MyClass* p>
// ^^^^^^^^ Non-type template argument
struct s
{
// Possibly work with p
};
int main()
{
s<&c> obj;
}
关于模板特:
关于代码你写道,你的主要模板处理任何类型:
template <typename T> struct s
{
// Definition...
};
这明确专业化(这是技术名称,而不是“总量”专业化)允许时使用的参数来实例化主模板您重新定义主模板的内容是MyClass*
:
template <> struct s<MyClass *>
{
// Definition when the template argument is `MyClass*`
};
举例来说,你可以这样做:
struct MyClass { };
template <typename T> struct s
{
void print() { cout << "Primary template!" << endl; }
};
template <> struct s<MyClass *>
{
void print() { cout << "Specialization for MyClass*!" << endl; }
};
int main()
{
s<int> obj;
obj.print(); // Will print "Primary template!"
s<MyClass*> obj;
obj.print(); // Will print "Specialization for MyClass*!"
}
铝所以请注意,该专业模板的定义可能是从主模板的定义完全不同:
template <typename T> struct s
{
void print() { cout << "Primary template!" << endl; }
};
template <> struct s<MyClass *>
{
void greet() { cout << "Specialization for MyClass*!" << endl; }
};
int main()
{
s<int> obj;
obj.print(); // Will print "Primary template!"
s<MyClass*> obj;
obj.greet(); // Will print "Specialization for MyClass*!"
obj.print(); // ERROR! s<MyClass*> has no `print()` member function
}
当然,这仅仅是类模板专业化的运作方式。按照我所做的方式区分主模板和专用模板的定义没有任何用处。
然而,存在许多现实世界的用例。例如,对于某些特定类型,通用算法可能会以完全不同的方式进行优化和重写。
模板专业化的另一个重要应用是定义特征,您可能想要阅读它。
想必如果您需要为MyClass *定制行为会很有用吗? – 2013-03-02 14:12:07
基于这个和你以前的问题:你可能会误解模板的整个概念*。它们是*编译时*结构。 – delnan 2013-03-02 14:16:02