我试图了解a program demonstrating boost/spirit。
在以下模板定义中:
template <typename Iterator>
struct roman : qi::grammar<Iterator,unsigned()> {
roman() : roman::base_type(start)
{
using qi::eps;
using qi::lit;
using qi::_val;
using qi::_1;
using ascii::char_;
start = eps[_val = 0] >>
(
+lit('M')[_val += 1000]
|| hundreds[_val += _1]
|| tens[_val += _1]
|| ones[_val += _1]
)
;
}
qi::rule<Iterator,unsigned()> start;
};
我试图了解: roman::base_type(start)
的含义。
roman::base_type(start)
初始化名为roman
的基础base_type
typedef
的{{1}},grammar<Iterator, T1, T2, T3, T4>
继承了该roman
。我不明白当start
是start
的成员roman
,我们仍在构建的派生类时,如何使用function getRandom(json){
var n = arguments[1] || 1;
var assoc_array = [];
var result = [];
var random_num = 0;
for(var i in json){
if(json.hasOwnProperty(i)){
if(typeof assoc_array[ json[i].area_description ] == 'undefined'){
assoc_array[ json[i].area_description ] = [];
}
assoc_array[ json[i].area_description ].push(json[i]);
}
}
while(n > 0){
for(var key in assoc_array){
if(assoc_array.hasOwnProperty(key)){
random_num = Math.floor(Math.random() * (assoc_array[ key ].length));
if(typeof assoc_array[ key ][ random_num ] != 'undefined'){
result.push(assoc_array[ key ][ random_num ]);
}
}
}
n--;
}
return result;
}
进行初始化?
答案 0 :(得分:2)
围绕文档中的示例的叙述:
- 通过为基本语法类提供启动规则来初始化它(它是语法开始解析时调用的第一个规则)
醇>
来源:http://www.boost.org/doc/libs/1_60_0/libs/spirit/doc/html/spirit/qi/tutorials/roman_numerals.html
它正在传递对该成员的引用。虽然此时不构造成员,但对其的引用是有效的。如果基类没有取消引用引用(即只存储它或取其地址),那么代码是合法的......如果有点'危险'。