2012-01-25 44 views
2

我有一個升壓xpressive中sregex和語義作用等同於以下內容:如何使用boost :: xpressive static引用語義動作中的可選submatch?

Rule = ('[' >> (s1=!(set=')',']','>')))[some_op(as<std::string>(s1))]; 

以前我是用這個升壓1.43沒有任何問題。我最近不得不升級到更新的版本,現在我遇到了以下問題。 當submatch不匹配任何內容(因爲它是可選的)時,在提升1.48時,當as在空對象上執行時,bad_lexical_cast異常將由語義操作拋出。

我該如何解決這個問題,它只是一個巧合,它之前的工作,並有一些更好的安全方式,我應該用它來做到這一點?或者這只是例如lexical_cast代碼中的一些更改現在打破了xpressive

信息

我已成功地暫時解決通過改變regex_actions.hpp下列實際問題:

template<typename T> 
struct as 
{ 
    BOOST_PROTO_CALLABLE() 
    typedef T result_type; 

    template<typename Value> 
    T operator()(Value const &val) const 
    { 
     return lexical_cast<T>(val); 
    } 
}; 

分爲:

template<typename T> 
struct as 
{ 
    BOOST_PROTO_CALLABLE() 
    typedef T result_type; 

    template<typename Value> 
    T operator()(Value const &val) const 
    { 
     if(val.first==val.second) 
     { 
      return T(); 
     } 
     else 
     { 
      return lexical_cast<T>(val); 
     } 
    } 
}; 

這使我相信,也許這是需要在xpressive本身中解決的問題。然而,我並不是100%相信這不是我在我身邊做錯的事情,任何對xpressive有更多知識的人都會對此有所瞭解?

+0

不確定它是否受支持,但是您嘗試過'some_op(如>(s1))'? – ildjarn

+0

@ildjam不幸的是我不認爲這會有所幫助(即使'可選'在這裏可用)''lexical_cast'仍然會發生並仍然會出錯。我可以在這裏看到'可選'的唯一方法是如果's1'本身被聲明使用它,但是這需要在'xpressive'內部進行更改。無論如何,我確實嘗試了你的建議,以防萬一,但似乎無法使它以有用的方式工作。 –

+0

是的,我不確定Xpressive是否支持與Boost.Optional的集成(Boost.Spirit呢,這就是爲什麼我認爲Xpressive可能)。我認爲你最好的選擇是讓'some_op'採取適當的'sub_match'並在轉換爲字符串之前進行適當的成功檢查。 – ildjarn

回答

1

調查了一點,與Xpressive作者我得出的結論是,這是無論是在lexical_cast行爲的迴歸或預期lexical_cast的運行方式xpressive的錯誤溝通後。

+0

這確實是'lexical_cast'中的一個迴歸。我提交了一個[bug](https://svn.boost.org/trac/boost/ticket/6452)。感謝報告! –

相關問題