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
。
- Eclipse中的Java:我在哪里把文件放在我想用getResource加载的文件系统上? (例如ImageIcon的图像)
- ASP.NET Core(ASP.NET 5)应用程序中提供了哪些框架?