最近,我看到了一个不熟悉的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时尚未声明。它是否类似于使用变量名称的前向声明?
请告诉我这些声明的工作原理以及此类声明的用语(如果有的话)。
答案 0 :(得分:2)
考虑声明:
x3::rule<class expression> const expression("expression");
class expression
声明新类型(expression
)并将其用作rule<>
模板的模板参数。它通常被称为临时类型,因为它将在其他任何地方使用(类型不完整)。
expression
,term
和factor
都有不同的类型。这是一个最小的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;
}