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