Некоторым известно, что в Arageli при
компиляции с Visual C++ 2005 обнаруживается
ошибка, свазанная с изменениями в
трактовке символа запятой "," при вводе
строк по сравнению с предыдущими (или
другими, не от Microsoft) реализациями C++.
Например, следующий код:
#include <iostream>
#include <arageli/arageli.hpp>
int main ()
{ Arageli::vector<int> a = "(1, 2, 3)"; }
Прекрасно отработает в Visual C++ 2003, но
вызовет исключение Arageli::incorrect_string в Visual
C++ 2005. Проблема в том, что запятая в
новой версии продукта трактуется как
разделитель тысяч с группами цифр по 3.
Эта проблема не слишком активно
обсуждается в Интернете; я нашёл лишь
пару реальных попыток её решить в
англоговорящем мире и ни одной --- в
рускоговорящем. Может быть, я плохо
искал и кто-нибудь укажет мне на
подобное обсуждение.
Тем не менее по одному источнику
(http://groups.google.com/group/microsoft.public.vc.language/browse_frm/thread/64ac882a37ddb1e9/eee6c084d09bf204is):
"...The MS product team has decided this is a bug with no workaround.
They a considering oit for a Quick Fix Engineering..." И более
никакой информации не поступало (это
было более полугода назад). А по
другому
(http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=700005&SiteID=1)
во всём виноват стандарт C++, и
предложено решение по созданию нового
объекта локализации с корректной
пунктуацией.
Может быть кто-нибудь знает, как решить
эту проблему максимально просто и не
накладно по времени/памяти исполнения.
Требуется способ, подходящий для Arageli,
т.е. изменения должены затрагивать
ТОЛЬКО ввод объектов Arageli.
Делаю так:
struct nocommapunct : public std::numpunct<char>
{ protected: char do_thousands_sep() const { return 0; } };
nocommapunct ncp;
std::locale oldloc = in.getloc();
in.imbue(std::locale(oldloc, &ncp));
... делаем ввод из in ...
in.imbue(oldloc); /* возвращаем всё как было */
В конце блока, когда удаляется oldloc в
деструкторе срабатывает ассерт, ---
какая-то проблема с памятью.
Замена in.imbue(std::locale(oldloc, &ncp)) на
in.imbue(std::locale(oldloc, new nocommapunct())) похоже,
решает проблему, но надо получить
подтверждение от Страуструпа :) а так
же узнать о получившемся замедлении
при вводе.
Итак, обозначеная проблема с запятыми
в VS2005, похоже, решена. Только что
выгруженная ревизия Arageli (222) будет
работать корректно вводить вектора.
Если у кого-то появятся проблемы из-за
внесённых изменений или комментарии и
пожелания по данной теме, пишите!