Re[2]: Сравнение std::string без учета регистра
От: Павел Кузнецов  
Дата: 14.01.05 16:51
Оценка:
> Не понятно где и какую роль играет std::locale? Приведите пожалуйста реализацию конструктора ToUpper(const std::locale&).

std::locale используется для получения std::ctype:
class ToUpper
{
public:
   ToUpper(const std::locale& l)
   : m_ct (std::use_facet<std::ctype<char> >(l))
   {
   }

   char operator()(char c) const
   {
     return m_ct.toupper(c);
   }

private:
   const std::ctype<char>& m_ct;
};

Но здесь есть тонкий момент: facet m_ct будет жить только пока жива locale, из которой он получен. Т.к. периодически могут использоваться временные объекты std::locale и ToUpper может использоваться не в точке создания, то более надежным вариантом будет продление жизни полученной std::locale:
class ToUpper
{
public:
   ToUpper(const std::locale& l)
   : m_l  (l)
   , m_ct (std::use_facet<std::ctype<char> >(m_l))
   {
   }

   char operator()(char c) const
   {
     return m_ct.toupper(c);
   }

private:
   std::locale m_l;
   const std::ctype<char>& m_ct;
};
Posted via RSDN NNTP Server 1.9
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.