我有一個升壓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
有更多知識的人都會對此有所瞭解?
不確定它是否受支持,但是您嘗試過'some_op(如>(s1))'? –
ildjarn
@ildjam不幸的是我不認爲這會有所幫助(即使'可選'在這裏可用)''lexical_cast'仍然會發生並仍然會出錯。我可以在這裏看到'可選'的唯一方法是如果's1'本身被聲明使用它,但是這需要在'xpressive'內部進行更改。無論如何,我確實嘗試了你的建議,以防萬一,但似乎無法使它以有用的方式工作。 –
是的,我不確定Xpressive是否支持與Boost.Optional的集成(Boost.Spirit呢,這就是爲什麼我認爲Xpressive可能)。我認爲你最好的選擇是讓'some_op'採取適當的'sub_match'並在轉換爲字符串之前進行適當的成功檢查。 – ildjarn