模板类变量声明中的“class VARIABLE”?

时间:2014-07-16 01:02:42

标签: c++ templates

最近,我看到了一个不熟悉的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的表达式,术语和因子变量。什么是好奇的事情&lt; class expression&gt;例如,部分。我从来没有见过这样的状态。

当声明模板类的变量时,指定一个类型&#39;作为模板参数,所以我可以猜测类的表达式&#39;是指某种类型。但是,表达式是变量的名称和关键字&#39; class&#39;的组合,即&#39;类表达式&#39;看起来很尴尬。此外,变量&#39;表达&#39;在实例化x3 :: rule时尚未声明。它是否类似于使用变量名称的前向声明?

请告诉我这些声明的工作原理以及此类声明的用语(如果有的话)。

1 个答案:

答案 0 :(得分:2)

考虑声明:

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

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

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

这是一个最小的demonstration

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;
}