我有一个课程模板
template <class T>
class A
{
};
非常奇怪的专业化
template <>
class A<class T*> : private A<void *>
{
};
有人可以解释这种结构的含义吗?
答案 0 :(得分:4)
模糊处理声明了一个T类并专门化了T *
的模板#include <iostream>
template <class T>
class A
{
public:
static void f() { std::cout << "Template" << '\n'; }
};
// Declare a class T and specialize the template for T*
template <>
class A<class T*> : private A<void *>
{
public:
static void f() { std::cout << "Specialization" << '\n'; }
};
class T {};
int main()
{
// Template
A<int*>::f();
// Specialization
A<T*>::f();
}
答案 1 :(得分:4)
我认为预期的代码是:
template <class T>
class A<T *> : public A<void*>
{
};
这是一个部分特化,将用于任何指针类型,而不是通用指针类型。也就是说,任何时候A
都使用指针类型进行实例化,它将使用此declearation而不是通用的。{/ p>
当然,您需要在此声明之前实例化或以其他方式使A<void*>
,特殊化,否则您将获得无限递归:
template class A<void*>;
这是一种迫使编译器重用代码的常用习惯用法。也就是说,您知道A<T*>
的每个实例基本相同,因为所有指针在引擎盖下的行为都相同。因此,您提供A<void*>
的完整实例化,然后从其继承任何其他A<T*>
,在需要时进行内联转换。
由于A<T*>
继承自A<void*>
,因此它不需要在其实例化中提供大量的类代码。较小的代码有望产生更好的性能。
提前完整示例,未经测试:
template <typename T>
class A
{
public:
A()
:m_data(0)
{}
void set(T x)
{ m_data = x; }
T get()
{ return m_data; }
//here there will be more complex operations
private:
T m_data;
//and a lot of data depending on T
};
template class A<void*>; //splicit instantiation
template <typename T>
class A<T*> : public A<void*>
{
private:
typedef A<void*> base_type;
public:
//only the public, and maybe protected, functions are needed
//but the implementation is one-line each
void set(T *x)
{ base_type::set(x); }
T *get()
{ return static_cast<T*>(base_type::get()); }
};