了解解析模板的构造函数初始化程序

时间:2016-03-29 19:50:03

标签: c++ boost boost-spirit

我试图了解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)的含义。

  • 我认为它是constructor initializer
  • 此外,我认为它是member initializer list
    • 成员初始值设定项roman::base_type(start)初始化名为roman的基础base_type
    • 实际上是typedef的{​​{1}},grammar<Iterator, T1, T2, T3, T4>继承了该roman

我不明白当startstart的成员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; } 进行初始化?

1 个答案:

答案 0 :(得分:2)

围绕文档中的示例的叙述:

  
      
  1. 通过为基本语法类提供启动规则来初始化它(它是语法开始解析时调用的第一个规则)
  2.   

来源:http://www.boost.org/doc/libs/1_60_0/libs/spirit/doc/html/spirit/qi/tutorials/roman_numerals.html

它正在传递对该成员的引用。虽然此时不构造成员,但对其的引用是有效的。如果基类没有取消引用引用(即只存储它或取其地址),那么代码是合法的......如果有点'危险'。