次と同等のブースト表現の sregex とセマンティック アクションがあります。
Rule = ('[' >> (s1=!(set=')',']','>')))[some_op(as<std::string>(s1))];
以前はこれをブースト 1.43 で問題なく使用していました。最近、新しいブーストにアップグレードする必要がありましたが、次の問題が発生しました。サブマッチが何も一致しない場合 (オプションであるため)、boost 1.48 では、空のオブジェクトで実行さbad_lexical_cast
れると、セマンティック アクションによって例外がスローされます。as
s1
この問題を解決するにはどうすればよいですか。以前は機能していたのは単なる偶然であり、これを行うために使用すべきより安全な方法がありますか? それとも、これはたとえば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
.