2013-02-26 21 views
5

Bir sembol tablosunu varsa:Arıyor/yineleme boost :: ruh :: qi :: semboller

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

Ben veri değeriyle sembolü aramak için masanın üzerinden yineleme istiyorum. Ben basit bir sınıf uygulanan bu yüzden lambda ifadeleri kullanamazsınız:

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

Ve şöyle ben kullanıyorum: Ben _found = s bir kesme noktası ayarlarsanız

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

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

O _found teyit edebilir set oluyor Ancak, search.found() her zaman boş bir dize döndürür. Tahminimce, funtor'un for_each içinde çağrılmasıyla ilgili bir şey var ama ben bilmiyorum.

Neyi yanlış yapıyorum?

+2

nitpick: üye değişken yazılmalıdır * _sought * değil * _saught * :) – Praetorian

cevap

5

O

  • dize gerçek değeri orijinal olarak (yararsız durum bilgisi functor hale funktoru değeri tarafından geçirilmediğini

  • (olası) boş dizesi olduğunu olabilir devlet aslında geçmeyecek).

Sen _found alan bir referans yapabilir (eğer o iş yapmak için Kural-Of-Üç saygı emin olmak için gerektiren). 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

Eklenen bir İşte

SymbolSearcher yoluyla bir gidiş dönüş sonucunu öne sürerek prensibini gösteren bir gösteri var tam çalışma [liveworkspace'de gösteri] (http://liveworkspace.org/code/4qupWC$1) – sehe