c++ 模板类和类模板之间有什么区别?

1dkrff03  于 2022-12-01  发布在  其他
关注(0)|答案(9)|浏览(183)

模板类和类模板之间有什么区别?

qyyhg6bp

qyyhg6bp1#

这是一个常见的困惑点,许多(包括Wikipedia上的泛型编程页面、一些C教程以及本页面上的其他答案)。就C而言,没有“模板类”这样的东西,只有“类模板"。阅读该短语的方式是“类的模板”,而不是“函数模板,”这是“函数的模板”。同样:类不定义模板,模板定义类(和函数)。例如,这是一个 * 模板 *,特别是一个 * 类模板 *,但 * 它不是类 *:

template<typename T> class MyClassTemplate
{ 
    ...
};

声明MyClassTemplate<int>是一个类,或者迂腐地说,是一个基于模板的类。 基于模板的类与不基于模板的类没有特殊属性。 特殊属性是 * 模板本身的 *。
短语“template class”没有任何意义,因为就C++而言,单词“template”在应用于名词“class”时没有任何形容词意义。它意味着存在一个 class,即
是**(或定义)一个 template,这在C++中是不存在的概念。
我理解常见的混淆,因为它可能是基于这样一个事实,即单词在实际语言中以“模板类”的顺序出现,这是一个完全不同的故事。

ujv3wf0j

ujv3wf0j2#

C的创造者Bjarne Stroustrup在他的书 *《C编程语言》第4版 *,23.2.1定义模板中说:
有些人在术语 class templatetemplate class 之间进行语义区分。那就太微妙了:请将这些术语视为可互换的。同样,我认为 * 函数模板 * 与 * 模板函数 * 可互换。

ttcibm8c

ttcibm8c3#

不同的是,C++标准中根本不存在“模板类”这个术语,它主要是被认为“类模板”这个术语容易混淆的人使用的(比如Qt公司Nokia和以前的Trolltech)。
标准没有它的概念,所以要由其他人来做改变。一些人使用它的同义词,而其他人说术语“模板类”指的是示例化的或显式专门化的类模板,这将使它等价于术语“类模板专门化”。历史上,它有这个含义。Annotated Reference Manual定义在第343页
从类模板生成的类称为模板类,特别定义的名称为 template-class-name 的类也称为模板类
非终结符 template-class-name 等效于当今标准中使用的非终结符 template-id,其形式为template-name < arguments >
让你熟悉今天的术语,这比使用可疑的旧术语更重要

// (1) defines a class template
template<typename T> class A { }; 

// (2) defines a class template explicit specialization 
template<> class A<int> { };

// (3) defines a class template partial specialization
template<typename T> class A<T*> { };

// (4) explicitly instantiates A<char>. 
template class A<char>;

// (5) implicitly instantiates A<short> (because of the member declaration)
struct D { A<short> a; };
  • ARM把类(2),以及由(4)和(5)生成的类称为一个 template class。我不确定ARM是否已经知道部分特化。但是如果是这样的话(3)就不被称为一个template class,因为(3)没有定义一个类,而是定义了一个模板。
  • 当前标准调用类(2)、古井的生成(四)及(5)* 类模板特殊化 *. And(3)称为“部分专门化”,与“显式专门化”相对。(3)专业化(3.2/5 --但是有明确的交叉链接),尽管我发现这对我来说并不完全清楚,因为它将“专门化”定义为“类”,函数或类成员”“,而(3)不满足。
mlnl4t2r

mlnl4t2r4#

模板类与Template Method design pattern相关,而类模板只是一个“填空”类模板。

dtcbnfnu

dtcbnfnu5#

类模板是用于生成类的模板,而模板类是由模板生成的类。

von4xj4u

von4xj4u6#

模板类别:具有泛型定义的类或具有参数的类,在客户端提供信息之前,该类不会示例化。它是指普通模板的行话。简单的类带有前缀template并使用T。类模板:一个类的单个构造由一个类模板来指定,这与使用一个类构造单个对象的方式几乎相似。它引用模板类的一个对象Ex- classname objectname(参数列表)

ckx4rj1h

ckx4rj1h7#

类模板是不同类型对象的通用类。基本上它提供了一个基于参数生成类的规范。每当创建一个新对象时,一个新的类就会在内存中产生。这称为示例化类模板,每个示例化的类版本都称为模板类。

gupuwyp2

gupuwyp28#

看一看this paper(from wg21 and was published in 1992)

一致的术语

到目前为止,许多争论和分歧都是关于描述模板的章节中使用的术语。最常见的是**'function-template''template-function'的不同应用,以表达不同的想法和意图。由于没有应用一致的命名,结果是混乱和争论。
就本文件而言,作为委员会在讨论模板时正式通过的提案,并用于澄清文件;我建议我们采用这样的形式化,即一个
尾随的'-template'描述一个模板所描述的一组类型或函数。而一个前导的'template-',用于描述一个'-template'**的一部分的模板定义,例如一个'template-member-function'。因此:-

    • *'function-template':**由模板描述的一组函数,对作为该模板的参数提供的某些类型信息进行参数化。例如:-
template<class T> int nullcheck( T* pT )
{ return ( pT != 0 ); }
    • *'class-template':**由模板描述的一组类,对作为该模板的参数提供的某些类型信息进行参数化。例如:-
template<class T> class S {
int i;
public:
int sep_member();
int imm_member()
{ return 2; }
}
    • *'template-function':不再允许使用此术语。
    • *'template-class':不允许使用这个词汇。
    • *“member-function-template ':**不允许使用此术语,因为它描述得是模板定义当前不支持得属性.使用上述术语约定,它将描述非类模板得成员,其定义本身就是模板.例如:-
class Normal { public:
template<class T> int foo(T*pT)
{ return ( pT == 0 ); }
};

但是,由于模板当前仅限于全局范围,因此这样的模板无效。

    • “模板静态成员函数”:*
    • “模板成员函数”:*
    • '模板静态成员':*
    • 'template-static-data-member***' template-member ':**成员定义的替代词汇,与其所属的'class-template'分开显示。例如:-
template<class T> int S<T>::sep_member()
{ return i; }
ecfdbz9o

ecfdbz9o9#

我想标准C++基金会是关于这个主题的最权威的来源:
...模板类(类模板的示例化)...
https://isocpp.org/wiki/faq/templates#templates-defn-vs-decl

相关问题