gpt4 book ai didi

属于模板类的成员模板的 C++ 显式特化

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:14:31 26 4
gpt4 key购买 nike

在目前的C++标准草案中,this paragraph中就有这个例子属于与模板的显式特化相关的部分:

template<class T> struct A {
void f(T);
template<class X1> void g1(T, X1);
template<class X2> void g2(T, X2);
void h(T) { }
};

// specialization
template<> void A<int>::f(int);

// out of class member template definition
template<class T> template<class X1> void A<T>::g1(T, X1) { }


// member template specialization
template<> template<class X1> void A<int>::g1(int, X1); //(1)

// member template specialization
template<> template<>
void A<int>::g1(int, char); //(2)

在 (1) 中,g1 似乎更像是 A (A<​​ int >) 的特殊版本中的函数模板,而在 (2) 中,它似乎是 g1 本身专门用于其自己的设置模板参数((int,来自 A ),char)。

我发现这些特化之间存在差异(同样,(1)感觉就像声明一个新版本的 g1 用于其“容器”的“特殊版本” A,而 (2) 感觉像是关于 g1 本身(或关于它自己的模板参数)的特化。

此外,考虑这个例子:

template<class T> struct A{
int f() { return 1; }
}

template<>
int A<int>::f() { return 2; } //(3)

对我来说 (1) 和 (3) 是相同的“特化”,链接到“容器”的特殊版本,而 (2) 是实体(模板)本身的特化。

标准是否提到了这种差异,或者这两种特化是否相同?

谢谢。

最佳答案

首先,您的#3 相当于引用示例中的第一个特化,除了标准的 f在其签名中使用类的模板参数——大概是为了说明这一点,因为签名必须匹配特化,所以类的模板参数可能需要在特化声明中重复。

然后,区别在于#1 是A<T>成员 的特化。什么时候Tint —一种用于编写 A<int> 特化的速记本身与主模板基本相同。特别是,为了避免误导,被专门化的成员的签名必须与主模板(的实例化)保持不变。在这种情况下,这意味着它仍然是一个模板。

另一方面,#2 是模板的特化,恰好A<int> 的成员。 —专业是A<int>::g1本身,而不是“A<T>::g1什么时候Tint ”至于#1。与#3 不同,这当然仅适用于成员是模板的情况。 (在这种情况下,#2 是#1 声明的模板的特化!)

[temp.expl.spec]/15 的部分要点是这两种情况在句法上有很大区别。区别主要是学术上的:两者都是对 templated entity 的外科手术改变。对于某些参数。

关于属于模板类的成员模板的 C++ 显式特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49832668/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com