模板类变量声明中的"class VARIABLE"是什么意思?

3

最近,我看到了一个关于C++模板的陌生语句,大致是这样的:

    x3::rule<class expression> const expression("expression");
    x3::rule<class term> const term("term");
    x3::rule<class factor> const factor("factor");

这是 Boost.Spirit.X3 的示例源代码 (https://github.com/djowel/spirit_x3/blob/master/example/x3/calc1.cpp#L41)。
这些行似乎声明了 x3::rule 模板类的 expression、term 和 factor 变量。有趣的是,例如 <class expression> 这样的语句我从未见过。
在声明模板类变量时,需要指定“类型”作为模板参数,因此我可以猜测“class expression”表示某种类型。然而,expression 是一个变量名,加上关键字“class”,即“class expression”似乎很奇怪。此外,在实例化 x3::rule 时,变量“expression”还没有被声明。这是否像使用变量名进行前向声明?
请告诉我这些声明是如何工作的,如果有任何术语,请告诉我。

1
只是将“临时类型”作为参数进行使用。请参阅 https://dev59.com/8WYq5IYBdhLWcg3wvzGm (天哪,我是怎么找到的?) - chris
@chris 这不是什么困难或复杂的事情。谢谢您! - slyx
1个回答

2

考虑以下语句:

x3::rule<class expression> const expression("expression");

class expression声明一个新类型(expression),并将其用作rule<>模板的模板参数。它通常被称为临时类型,因为它不会在其他地方使用(该类型是不完整的)。

  • 在你的例子中,expressiontermfactor都有不同的类型。
  • 在C++中,变量可以与类型具有相同的名称,这就是作者在此处所做的。

下面是一个最简化的演示

template<class T>
class rule
{
    public:
       std::string rules;  
};

int main(int argc, char** argv) {

  rule<class myexpression> myexpression;
  rule<class myexpression2> myexpression2;

  myexpression.rules = "hello";
  myexpression2.rules = "hello2";
  return 0;
}

2
给临时类型和变量取相同的名称有意义吗?如果没有,那只会让读者感到困惑,为什么不改为这样写:x3::rule<class expression_tag> const expression("expression") - v.oddou
所以,这只是“前向声明”的另一种形式,并且只要没有访问该参数类的任何成员,它就不会成为问题。谢谢! - slyx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接