【问题标题】:Template specialization and instantiation模板特化和实例化
【发布时间】:2015-02-12 04:57:34
【问题描述】:

这些概念对我来说有点不清楚。好吧,N4296::14.7 [temp.spec] 很好地定义了模板实例化:

实例化函数、类、类成员的行为 模板或成员模板称为模板 实例化。

如果我们有一个函数/变量/类模板,模板的实例化只是创建一个对象或函数。例如:

template<typename T> class U{ };
U<int> a; //instantiation

但是N4296:14.7.1 [temp.inst] 说(强调我的):

除非类模板特化已明确 实例化 (14.7.2) 或显式特化 (14.7.3),类 模板特化是隐式实例化的,当 专业化是在需要的上下文中引用的 完全定义对象类型或当类的完整性 类型会影响程序的语义。

模板特化的实例化的定义是什么,而不仅仅是模板的实例化?

【问题讨论】:

  • 对于第一种情况,编译器不会隐式实例化已经显式实例化的模板定义;第二,如果给定的参数与更专业的参数匹配,编译器根本不会实例化模板定义。

标签: c++ templates


【解决方案1】:

问题:

模板特化的实例化的定义是什么,而不仅仅是模板的实例化?

我的理解:

没有模板实例化这样的东西。你总是实例化一个模板特化。

如果你有:

template <typename T> struct Foo {};

Foo<int> foo;

您已经实例化了模板特化Foo&lt;int&gt;,而不是模板Foo

更新

假设你有以下类模板:

template <typename T> struct Foo
{
   static int a;
};

int getNext()
{
   static int n = 0;
   return ++n;
}

template <class T> int Foo<T>::a = getNext();

显式模板实例化

您可以使用以下方法创建 Foo&lt;char&gt;Foo&lt;int&gt; 的显式实例化:

template struct Foo<char>;
template struct Foo<int>;

即使Foo&lt;char&gt;Foo&lt;int&gt; 没有在您的代码中的其他任何地方使用,类模板也会为charint 实例化。

显式模板特化

您可以使用以下方法创建类模板的显式特化:

template <> Foo<double> {};

使用Foo

现在,让我们看看Foo的用法。

Foo<int> f1;    // An explicit instantiation has already been created.
                // No need for any further code creation.

Foo<double> f2; // An explicit specialization has already been created.
                // No need for any further code creation.

Foo<long> f3;   // There is no explicit instantiation or explicit specialization
                // Code needs to be created for Foo<long>

           

第三种情况,Foo&lt;long&gt; f3; 触发模板特化Foo&lt;long&gt; 的创建。我将短语“类模板特化被隐式实例化”解释为“从类模板创建Foo&lt;long&gt;。”

【讨论】:

  • 没有模板实例化这样的东西。你确定吗?因为N4296::14.7 [temp.spec]的第一句话告诉我们,实例化函数、类、类模板的成员或成员模板的行为称为模板实例化。我>
  • @DmitryFucintv,好点子。让我更仔细地阅读标准的这些部分。
  • 有趣,谢谢。但是你不能再澄清一个概念吗?我们有两个不同的概念:Partial specializationexplicit specialization。我们可以说explicit specialization 总是partial specialization 吗?
  • @DmitryFucintv,部分特化既不是显式实例化也不是显式特化。就本次讨论而言,部分特化与普通的类模板没有什么不同。
【解决方案2】:

“实例化模板特化”通常是指隐式实例化的过程:将特定模板参数替换为模板定义以获得实例化的类、函数等。实例化模板意味着实例化该模板的特化。通常,当我们在语言律师的背景下谈论一些任意的实例化时,会使用不太精确的措辞。您还会发现“模板的实例化”这一表述,它与实例化的专业化同义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-15
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多