我正在用 C++ 练习模板编程,试图仅使用模板来实现某种用于教育目的的解析器库。
我的图书馆应该如何使用的一个例子是:
std::stringstream ss { "identif1er 123123 hell0 world 3rror" };
// zM = zero or more , aO = any of
using Identifier = Matcher<Alpha, zM<AlphaNum>>;
using Number = Matcher<Digit, zM<Digit>>;
Matcher<aO<Identifier, Number>> numberOrIdentifier;
while(!ss.eof()) {
if(ss.peek() == ' ') ss.ignore(1);
if(numberLetters.s_match(ss)) {
std::cout << "Token: " << (*numberLetters.val) << std::endl;
} else {
std::cout << "Error\n";
}
}
这是可行的,但我遇到的问题是有时必须定义一对依赖于另一个类型的类型,反之亦然。
我只想知道我该怎么做,例如:
using Expr = Matcher<..... Factor ....>
using Factor = Matcher<aO<Number, Expr>>;
我怎样才能只使用类型而不使用构造函数参数来进行因子的前向声明?它可能吗?注意:我使用空结构“Self”来标记递归。
链接到模板的定义: