2010-09-29 40 views
1

我試圖找到一種優雅的方式來解析像一個字符串:istream的解析EVENT_TYPE(參數1,參數2,...)

EVENT_TYPE(param1;param2; ...) 

EVENT_TYPE是許多字符串常量之一,每個人都有零個或多個參數。 到目前爲止,我認爲,鑑於刺「S」包含EVENT_TYPE(參數1,參數2)我會寫:

if (boost::istarts_with(s, "EVENT_TYPE")) { 
    std::istringstream iss(s); 
    int param1, param2; 
    iss >> "EVENT_TYPE(" >> param1 >> ";" >> param2 >> ")"; 
} 

這將是很好的給予常量字符串&並告訴你這種方法「跳過這些字符」。那麼,情況並非如此。你會如何去做這件事? :-)

感謝您的建議!

+0

你也可能想看看在[這個相關的問題](http://stackoverflow.com/questions/3778268)。 – sbi 2010-09-29 17:11:36

回答

1

嗯,把我的頭頂部:

// Beware, brain-compiled code ahead! 
class string_const { 
public: 
    string_const(const std::string& str) : str_(str) {} 
    void read(std::istream& is) const 
    { 
    is >> std::ws; // if leading whitespace ok 
    for(std::string::size_type idx=0; idx<str_.size(); ++idx) { 
     char ch; 
     if(!(is >> ch)) 
     return; 
     if(ch != str_[idx]) { 
     str.setstate(std::ios:failbit); 
     return; 
     } 
    } 
    } 
private: 
    std::string str_; 
}; 

inline std::istream& operator>>(std::istream& is, const string_const& str) 
{ 
    str.read(is); 
    return is; 
} 

使用方法如下:

iss >> string_const("EVENT_TYPE(") >> ...;