2011-08-03 5 views
4

スピリットパーサーを実装するためにthis exampleを見ると、私が似たようなものを書くときに何かがわかりました。ブーストスピリットルールと文法のテンプレートパラメータのかっこ

文法の属性テンプレートパラメータ(std::map<std::string, std::string>())とルールの署名テンプレートパラメータ(たとえばqi::rule<Iterator, std::string()> key, value)には括弧が含まれています。

namespace qi = boost::spirit::qi; 

template <typename Iterator> 
struct keys_and_values 
    : qi::grammar<Iterator, std::map<std::string, std::string>()> // <- parentheses here 
{ 
    keys_and_values() 
     : keys_and_values::base_type(query) 
    { 
     query = pair >> *((qi::lit(';') | '&') >> pair); 
     pair = key >> -('=' >> value); 
     key = qi::char_("a-zA-Z_") >> *qi::char_("a-zA-Z_0-9"); 
     value = +qi::char_("a-zA-Z_0-9"); 
    } 
    qi::rule<Iterator, std::map<std::string, std::string>()> query; // <- parentheses here 
    qi::rule<Iterator, std::pair<std::string, std::string>()> pair; // <- parentheses here 
    qi::rule<Iterator, std::string()> key, value; // <- parentheses here 
}; 

私は前にこれを見たことがない、と私自身のバージョンを書いたとき、私は無意識を省略します。これは私のパーサーが正しい出力ランタイムを生成しない(出力マップは空です)。

これらのかっこの目的は何ですか?私の推測では、これはこのルールの属性をそのタイプのオブジェクトにすることです。

答えて

6
std::map<std::string, std::string>() 

これは機能タイプです。

()は、「std::map<std::string, std::string>を返し、パラメータを持たない関数」を意味します。

()が指定されていない場合、タイプは「std::map<std::string, std::string>」です。これは正しくありません。

+2

Ha!特にブースト/スピリットはまったく関係ありません! –

関連する問題