5

シンボルテーブルがある場合:

struct MySymbols : symbols<char, MyEnum::Fruits>
{
    MySymbols ()
        : symbols<char, MyEnum::Fruits>(std::string("MySymbols"))
    {
        add("apple", MyEnum::Apple)
           ("orange", MyEnum::Orange);
    }
};

データ値でシンボルを検索するために、テーブルを反復処理したいと思います。ラムダ式を使用できないため、単純なクラスを実装しました。

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;
};

そして、私はそれを次のように使用しています:

SymbolSearcher<MyEnum::Fruits> search(ct);
MySymbols symbols;

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

ブレークポイントを設定_found = sすると、_foundが設定されていることを確認できますが、search.found()は常に空の文字列を返します。for_each内でファンクターが呼び出される方法と関係があると思いますが、わかりません。

私は何が間違っているのですか?

4

1 に答える 1

5

それはそれかもしれません

  • 文字列の実際の値は空の文字列です(可能性は低いです)

  • ファンクターは値によって渡され、ステートフルファンクターは役に立たなくなります(元の状態は実際には渡されないため)。

フィールドを参照にすることができ_foundます(それを機能させるには、三つのルールを尊重する必要があります)。

SymbolSearcherこれは、http ://liveworkspace.org/code/4qupWC$1を介してラウンドトリップの結果を主張することによって原理を示すデモンストレーションです。

#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());
}
于 2013-02-27T01:26:24.987 に答える