类模板和模板类

时间:2010-06-06 04:57:30

标签: c++ templates

类模板和模板类之间是否存在差异。如果是这样的话是什么?

7 个答案:

答案 0 :(得分:10)

当使用这两个术语时,存在非常微妙的差异。它比语义更具语言性,它取决于你正在修改哪个词。

简而言之,类模板是一种特殊的模板。模板可以定义类或函数。类模板是定义类的模板。看到差异:

template <typename T> class SomeClass {...};      // this is a class template
template <typename T> int some_function(T&) {...} // this is a function template

模板类是一种特殊的类。类有很多种,特别是模板类是使用类模板定义的类。对比:

SomeClass sc;         // SomeClass is an ordinary (non-template) class
SomeClass<int> sc;    // SomeClass<int> is a template class

来自Stroustrup's C++ Glossary

  

模板类 - 按类型,值或模板参数化的类。该   标识要为其生成的类所必需的模板参数   必须在使用模板类的地方提供类模板。对于   示例“vector<int> v;”从向量生成一个int向量   模板。另见模板。 TC ++ PL 13.2,D&amp; E 15.3。

直到1998年,这两个表达式都用在Stroustrup的书“C ++编程语言”和ISO / IEC C ++标准中。

注意:正如下面的评论中所讨论的,似乎C ++ 03不再使用术语“模板类”了(虽然我没有它的副本),大概是为了减少混乱。正如我之前所说,它们基本上是相同的,它只是语言上的差异:在模板上下文中,您引用特定类型的模板,或者在类上下文中引用特定类的类。如果你只是坚持“课堂模板”,你就不会失去任何东西。

更多值得深思的话:

答案 1 :(得分:3)

这个问题也在关于C ++模板的权威书籍{"C++ Templates: The Definitive Guide", by Vandvoorde and Josuttis),第7.1节,第87页(至少在我的版本中)中得到了具体解决:

  

7.1“类模板”或“模板类”?

     

[剪断]

     

关于如何做一些混乱   作为模板的类被称为:

     

术语类模板表明了这一点   该类是一个模板。这就对了   是a的参数化描述   班级家庭。

     

另一方面,术语模板类   手已被使用

     
      
  • 作为课程模板的同义词。

  •   
  • 引用从模板生成的类。

  •   
  • 引用名称为template-id的类。

  •   
     

第二和第二的区别   第三个含义有点微妙   其余部分不重要   文本。

     

由于这种不精确,我们避免   本书中的术语模板类

     

同样,我们使用功能模板   和成员函数模板,但是   避免模板功能模板   会员职能

(任何人,我的意思是任何人,使用C ++模板应该有本书的副本。)

答案 2 :(得分:1)

不,这两个术语指的是同一件事。在这两种情况下,它都是一个定义为:

的类
template<typename T> class Foo {};

这与刚刚声明为:

的常规类形成对比
class Foo {};
如果你认为它是一种特殊的类,那么“模板类”是有意义的。如果您认为“类模板”实际上不是一个类,而是一个类的模板,那么“类模板”是有意义的。后者更准确,因为在模板实例化之前不存在实际的类,例如:

Foo<char> x;

答案 3 :(得分:1)

类模板是用于创建类的模板。模板类是作为模板实例化创建的类。

答案 4 :(得分:1)

我认为class template是一种模板,template class是从class template实例化的类。

答案 5 :(得分:1)

现在由于C ++的影响,这两者可以互换使用。在过去,C ++之前的模板,模板类是面向对象设计术语的一部分。模板类背后的想法是它形成了执行框架,其中包含明确定义的,被覆盖的“热点”(实现中的虚拟方法),子类将提供功能。效果类似于以下伪代码:

class templateClass:
  public:
    virtual hotSpotA: nil
    virtual hotSpotB: nil
    method templateExecute:
      do some stuff
      hotSpotA
      do some other stuff
      hotSpotB
      do even more stuff

然后,您将使用此模板类继承并实现hotSpots:

class templateClient from templateClass:
  public:
    override hotSpotA:
      client-specific stuff A
    override hotSpotB:
      client-specific stuff B

client = new templateClient
client.templateExecute

许多设计元模式依赖于这种结构(事实上,如果你看大多数OO设计模式,你会看到这种结构以各种形式一直使用)。

现在你不会再看到这个术语了,因为C ++的恶毒影响。我不确定这个元模式结构的当前术语是什么,因为除非被迫使用它,否则我几乎完全放弃了OOP。

如果你想阅读它,有一本书非常详细地解释了这个(和其他元模式):Design Patterns for Object-Oriented Software Development

答案 6 :(得分:0)

 What is the difference between a template class and a class template?
 What is the difference between a template function and a function template?

问题是:正在修改什么?一般来说,如果我们说某事物是“温室”,那么物体就是房子,那恰好是绿色的。考虑到这一点,这显然是一个类:

struct SomeClass {
   int i;
   };

虽然这显然是一个模板:

 template <typename T>
 struct cTemplate {
 int member;
 };

它是什么样的模板? c模板类模板。沿着这些方向,这是一个功能:

void foo() {}

这是一个模板:

template <typename T>
T fTemplate(T arg)
{
 return arg * arg;
}

它是什么样的模板? fTemplate是一个功能模板。

现在,SomeClass是一个类名,因此我们可以编写如下内容:

SomeClass sc;

沿着这些方向,我们知道我们可以做一些事情,例如:

cTemplate<int> cti;

换句话说,cTemplate也是一个类名。所以,cTemplate是一个类。想想看,它实例化时会有效:

template <> struct cTemplate<int> {
  int member;
}

这是什么课?好吧,可能没有必要对哪种类型进行限定,但如果是,那么cTemplate似乎就是模板类。同样,有功能。也就是说,如果要调用fTemplate,例如:

fTemplate(99.99);

然后在实例化一个函数之后:

fTemplate<double>(double)

特别是:

template <>
double fTemplate<double>(double)
{
  return arg * arg;
}

所以,如上所述,如果按下这是什么样的功能,似乎可以说这是一个模板功能。

以上都说,事实证明有些人使用模板类来表示与类模板相同的东西,因此,一些(其他)人不喜欢在前一个术语上放置特定含义。