У меня есть boost xpressive sregex и семантическое действие, эквивалентное следующему:
Rule = ('[' >> (s1=!(set=')',']','>')))[some_op(as<std::string>(s1))];
Ранее я использовал это на boost 1.43 без каких-либо проблем.Недавно мне пришлось перейти на более новую версию, и теперь я сталкиваюсь со следующей проблемой.На бусте 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);
}
};
Into:
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
имеет некоторое представление об этом?