我一直在仔细研究 C++ 中的模板,我发现似乎没有一套严格的术语来清楚地识别和区分/消除使用模板时可能出现的每个句法元素,这很有挑战性。
例如,Josuttis 和 Vandevoorde 经常参考(和首选)的关于模板的书《C++ 模板:完整指南》是一本出色的书——但即使是那本书也没有明确指出涉及模板的每个句法元素的严格术语。相反,从上下文中可以清楚地看到含义。
考虑下面这个简单的例子,我相信它突出了涉及模板的 11 个不同的相关句法组件。
#include <iostream>
#include <vector>
template
<
typename
M1, // <-- (1) "Primary template declaration template parameter
// identifier"
typename M2 // ditto
> // <-- (2) (entire <...> syntactic element) "Primary template declaration
// template parameter list"
class Foo
{
// <-- (3) "Primary class template definition"
};
template
<
typename
T1, // <-- (4) "Template specialization declaration template
// parameter identifier"
typename A1, typename M2 // ditto
> // <-- (5) (entire <...> syntactic element) "Template specialization
// declaration template
// parameter list"
class Foo
<
std::vector<T1, A1> &, // <-- (6) "Template specialization
// declaration TEMPLATE PARAMETER
// SPECIALIZATION ARGUMENT"
// (?)
M2
> // <-- (7) (entire <> syntactic element) "Template specialization
// declaration TEMPLATE PARAMETER
// SPECIALIZATION ARGUMENT LIST"
// (?)
{
// <-- (8) "Template specialization class definition"
};
int main()
{
Foo
<
std::vector<int> &, // <-- (9) "Template class instantiation
// template parameter"
// (?)
int // diito
> // <-- (10) (entire <> syntactic element) "Template class
// instantiation template
// parameter list"
// (?)
f; // <-- (11) "Template class instantiation instance variable name"
}
在代码示例中,我指出了 11 个不同的与模板相关的句法元素,并为每个元素提供了我建议的严格分类标签。
我怀疑我为这些元素中的大多数使用了正确的分类标识符(但如果我错了,请纠正我)。
然而,句法项 (6)、(7)、(9) 和 (10) 是棘手的——例如,在 (6) 和 (7) 的情况下,存在模板特化的情况,其中对of 尖括号<>
出现两次,因此在用于指示出现在这两个非常不同的尖括号对的尖括号之间的参数(参数?)的标识符中必须存在分类区别。模板实例化(9) 和 (10) 涉及尖括号的另一种使用,因此出现在这些括号内的参数也必须有自己的识别分类标识符。
也许,在这个问题中,我使用了适当的严格术语,但我想知道:
有没有比我用过的更简单严谨的术语?
我是否在识别标签中使用了无关和/或不必要的词?
我的识别标签中是否缺少单词?
我使用的识别标签是否正确?