模板专业化和实例化

时间:2015-02-12 04:57:35

标签: c++ templates

这些概念对我来说有点不清楚。好吧,模板实例化的定义很好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),类   模板特化是在隐式实例化的时候   在需要a的上下文中引用特化   完全定义的对象类型或类的完整性   type会影响程序的语义。

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

2 个答案:

答案 0 :(得分:2)

问题:

  

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

我的理解:

没有模板实例化这样的东西。您总是实例化模板专业化。

如果你有:

template <typename T> struct Foo {};

Foo<int> foo;

您已经实例化了模板专精Foo<int>,而不是模板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<char>Foo<int>的显式实例化

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

即使代码中的其他任何地方未使用Foo<char>Foo<int>,也会为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<long> f3;触发模板特化Foo<long>的创建。我解释短语“类模板专门化是隐式实例化的”,意思是“从类模板中创建Foo<long>。”

答案 1 :(得分:-1)

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