Boost.Spirit使用这个不寻常的C ++模板特性的名字是什么?

下面的代码来自Boost.Spirit x3文档 。 它使用了我以前从未见过的有趣的C ++语法,在不知道正确的术语的情况下几乎不可能在search查询中进行描述。 这是一个class的前进宣言的简写吗? C ++标准中提到的这个特性在哪里?

namespace parser { using x3::eps; using x3::lit; using x3::_val; using x3::_attr; using ascii::char_; auto set_zero = [&](auto& ctx){ _val(ctx) = 0; }; auto add1000 = [&](auto& ctx){ _val(ctx) += 1000; }; auto add = [&](auto& ctx){ _val(ctx) += _attr(ctx); }; // What is this? This is the very first use of the identifier `roman`. x3::rule<class roman, unsigned> const roman = "roman"; // ^^^^^^^^^^^ auto const roman_def = eps [set_zero] >> ( -(+lit('M') [add1000]) >> -hundreds [add] >> -tens [add] >> -ones [add] ) ; BOOST_SPIRIT_DEFINE(roman); } 

模板的参数不一定必须被定义为使用。 “罗马class”的使用实际上是宣布罗马class。

以下是一些示例代码:

 #include <iostream> template <class T> void foo(); template<> void foo<class roman>() { // allowed because roman is declared roman* pointer1; // not allowed because romania is not declared // romania* pointer2; std::cout << "Hello world!" << std::endl; return; } int main(int argc, char** argv) { return 0; } 

正如人们在上面的评论中指出的那样,这区分了这个模板的实例化。 为了直接回答您的问题,在模板实例化中指定模板参数的性质称为“详细描述types说明符”。

这是一样的:

 class roman; x3::rule<roman, unsigned> const roman = "roman"; 

换句话说,写一个types名为T的类,首先声明T是一个类的名字,然后继续T作为用于expression式其余部分的types名称。

请注意,在C ++中,types名称roman和variables名称roman之间没有冲突。 这是允许的。


另一个这种情况可能会发生在没有模板,例如:

 void func( class bar *ptr ); 

如果bar被宣布是正确的; 它声明bar ,然后声明函数采取一个指针bar