Скобки в параметрах шаблона в правилах и грамматике Boost Spirit - PullRequest
4 голосов
/ 04 августа 2011

Глядя на этот пример для реализации анализатора Spirit, что-то меня поймало, когда я пытался написать нечто подобное.

Параметр шаблона атрибута грамматики (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
};

Я никогда раньше этого не видел, и тогда я случайно пропустил это при написании своей собственной версии.Это привело к тому, что мой синтаксический анализатор не генерировал правильное время выполнения вывода (карта вывода пуста).

Какова цель этих скобок?Я предполагаю, что это делает атрибут этого правила объектом этого типа.

1 Ответ

6 голосов
/ 04 августа 2011
std::map<std::string, std::string>()

Это тип функции.

() означает "функция, которая возвращает std::map<std::string, std::string> и не имеет параметров".

Без () типом является просто "std::map<std::string, std::string>", что неверно.

...