2013-02-26 36 views
5

Nếu tôi có một bảng biểu tượng:Searching/lặp boost :: tinh thần :: khí :: ký

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

Tôi muốn để lặp qua bàn để tìm kiếm một biểu tượng của giá trị dữ liệu. Tôi không thể sử dụng biểu thức lambda vì vậy tôi thực hiện một lớp đơn giản:

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

Và tôi đang sử dụng nó như sau:

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

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

Nếu tôi đặt một breakpoint trên _found = s Tôi có thể khẳng định _found đó là việc thiết tuy nhiên search.found() luôn trả về một chuỗi rỗng. Tôi đoán nó có một cái gì đó để làm với cách functor đang được gọi là bên trong for_each nhưng tôi không biết.

Tôi đang làm gì sai?

+2

nitpick: các biến thành viên nên được đánh vần * _sought * không * _saught * :) – Praetorian

Trả lời

5

Có thể là

  • giá trị thực tế của chuỗi là chuỗi rỗng (không)

  • các functor đang được truyền theo giá trị, làm cho functor stateful vô dụng (như bản gốc tiểu bang sẽ không thực sự được thông qua).

Bạn có thể làm cho _found lĩnh vực một tài liệu tham khảo (đòi hỏi bạn phải đảm bảo tôn trọng Rule-Of-Ba để làm cho nó làm việc).

Dưới đây là một minh chứng cho thấy các nguyên tắc bằng cách khẳng định kết quả của một khứ hồi qua 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()); 
} 
+0

gia tăng một làm việc đầy đủ [trình diễn trên không gian sống] (http://liveworkspace.org/code/4qupWC$1) – sehe