首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >搜索/迭代boost::spirit::qi::symbols

搜索/迭代boost::spirit::qi::symbols
EN

Stack Overflow用户
提问于 2013-02-27 05:03:05
回答 1查看 606关注 0票数 5

如果我有一个符号表:

代码语言:javascript
复制
struct MySymbols : symbols<char, MyEnum::Fruits>
{
    MySymbols ()
        : symbols<char, MyEnum::Fruits>(std::string("MySymbols"))
    {
        add("apple", MyEnum::Apple)
           ("orange", MyEnum::Orange);
    }
};

我想遍历表,以便按数据值搜索符号。我不能使用lambda表达式,所以我实现了一个简单的类:

代码语言:javascript
复制
template<typename T>
struct SymbolSearcher
{
    SymbolSearcher::SymbolSearcher(T searchFor)
        : _sought(searchFor)
    {
        // do nothing
    }

    void operator() (std::basic_string<char> s, T ct)
    {
        if (_sought == ct)
        {
            _found = s;
        }
    }

    std::string found() const { return _found; }

private:
    T _sought;
    std::string _found;
};

我的用法如下:

代码语言:javascript
复制
SymbolSearcher<MyEnum::Fruits> search(ct);
MySymbols symbols;

symbols.for_each(search);
std::string symbolStr = search.found();

如果我在_found = s上设置了断点,我可以确认设置了_found,但是search.found()总是返回一个空字符串。我猜这与for_each内部调用函数器的方式有关,但我不知道。

我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-27 09:26:25

可能是这样的

  • 字符串的实际值是空字符串(不太可能)
  • 函数器是通过值传递的,这使得有状态函数器变得无用(因为实际上不会传递原始状态)。

您可以使_found字段成为一个引用(要求您确保遵守三重规则才能使其工作)。

下面的演示展示了通过SymbolSearcher断言往返结果的原理:

代码语言:javascript
复制
#include <boost/spirit/include/qi.hpp>

namespace qi     = boost::spirit::qi;

template<typename T>
struct SymbolSearcher
{
    SymbolSearcher(T searchFor, std::string& result) : _sought(searchFor), _found(result)
    {
    }

    void operator() (std::basic_string<char> s, T ct)
    {
        if (_sought == ct)
        {
            _found = s;
        }
    }

    std::string found() const { return _found; }

private:
    T _sought;
    std::string& _found;
};

int main()
{
    const std::string str("mies");

    typedef std::string::const_iterator It;
    It begin = str.cbegin();
    It end   = str.cend();

    qi::symbols<char, int> symbols;
    symbols.add("aap", 1)("noot", 2)("mies", 3);

    int out;
    bool ok = qi::parse(begin, end, symbols, out);
    assert(ok);

    std::string found;
    SymbolSearcher<int> sf(out, found);
    symbols.for_each(sf);

    assert(str == sf.found());
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15099202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档