Шаблонний клас num_get призначаний для правильного розпізнавання числових значень у рядках символів. Оголошення виглядає приблизно наступним чином:
template <class charT, class InputIterator = istreambuf_iterator<charT> > class num_get ;
Параметр шаблону charT призначений для вказування типу символів, з якими буде працювати клас. Параметр InputIterator призначений для вказування типу ітератора, який буде використовуватись для перебору символів. Ментод класу get використовується об'єктами воду, для зчитування числових значень (на подобі cin). Клас num_get має захищений деструктор, що означає неможливість створення примірника даного класу - користувачі повинні створюєвати примірники дочірніх класів і/або викристовувати готові об'єкти, які прикріплені до локалей (за допомогою функції has_facet). Усі стандартні об'єкти класу locale повинні підтримувати наступний мінімальний набір примірників об'єктів спеціалізованих класів:
  • num_get<char> для зчитування символів з байтових послідовностей;
  • num_get<wchar_t> для зчитування символів з розширеного типу символів.

Нутрощі класу

explicit num_get (size_t refs=0) ;
Конструктор класу num_get. Параметр refs впливає на видалення об'єкта. Значення нуль спричиняє автоматичне видалення об'єкта, коли остання локаль, яка зв'язана з ним, видаляється. Значення 1 вказує, що об'єкт не повинен автоматично видалятися.
/* бульове значяення */
iter_type get (iter_type in, iter_type end, ios_base& str,
               ios_base::iostate& err, bool& val) const ;

/* для long */
iter_type get (iter_type in, iter_type end, ios_base& str,
               ios_base::iostate& err, long& val) const ;

/* для unsigned short */
iter_type get (iter_type in, iter_type end, ios_base& str,
               ios_base::iostate& err, unsigned short& val) const ;

/* для unsigned int */
iter_type get (iter_type in, iter_type end, ios_base& str,
               ios_base::iostate& err, unsigned int& val) const ;

/* для unsigned long */
iter_type get (iter_type in, iter_type end, ios_base& str,
               ios_base::iostate& err, unsigned long& val) const ;

/* для float */
iter_type get (iter_type in, iter_type end, ios_base& str,
               ios_base::iostate& err, float& val) const ;

/* для double */
iter_type get (iter_type in, iter_type end, ios_base& str,
               ios_base::iostate& err, double& val) const ;

/* для long double */
iter_type get (iter_type in, iter_type end, ios_base& str,
               ios_base::iostate& err, long double& val) const ;

/* для pointer */
iter_type get (iter_type in, iter_type end, ios_base& str,
               ios_base::iostate& err, void*& val) const ;
Отримує числове значення. Розпізнає серію символів між ітераторами in і end і зберігає їх у значення val. Даний метод використовує налаштування форматування, які вказані у об'єкті str (значення ios_base::fmtflags) і змінює значення err під час помилки. Метод припиняє розпізнавати значення, поки не натрапляє на перший символ, який не може являтись частиною поточного числового значення. Тип ios_base::iostate, для змінної err може містити наступні значення констант:
  • goodbit вказує, що значення зчитано у val, успішне виконання операції не досягаючи end;
  • failbit - значення val не визначено, і метод не віднайшов значення, яке відповідало формату;
  • eofbit - разом з вищевказаними значеннями - метод досягнув ітератора end під час виконання роботи.
Даний метод являєтся делегатом - він викликає заїищений метод do_get з дочірніх класів.

Приклад

Розглянемо простий приклад використання класу num_get у коді програми.
#include <locale> /* num_get, locale, has_facet, use_facet etc. */
#include <iterator> /* istreambuf_iterator */
#include <iostream> /* wcin */
using namespace std ; /* друкуємо усе без std */

/* головна функція програми */
int main (int argc, char** argv)
{
  /* створюємо бажану локаль,
  ** яка визначається через 
  ** змінну середовища LANG */
  locale loc ("") ;
  
  /* перевіряє наявність facet-об'єкта 
  ** типу num_get<wchar_t> */
  if (!has_facet < num_get<wchar_t> > (loc))
  {
    /* якщо ні - виводиво відповідне повідомлення */
    cout << "Локаль " << loc.name() 
         << " немає facet-об'єкта num_get<wchar_t>!" << endl ;

    /* і завершуємо програму */
    return 0 ;         
  }
  
  /* отримуємо відповідний наш fecte-об'єкт локалі */
  const num_get<wchar_t>& num 
    = use_facet < num_get<wchar_t> > (loc) ;
  
  /* змінна для зберігання стану */
  ios_base::iostate iState ;
  /* змінна для зберігання років користувачу */
  long years = 1L ;
  
  /* виводимо запрошення до вводу 
  ** користувачу у термінал */
  cout << "Введіть свій вік: " ;
  
  /* створюємо ітератор вводу istreambuf_iterator */
  istreambuf_iterator<wchar_t> iit (wcin.rdbuf());
  
  /* зчитуємо символи і отримуємо 
  ** числове значення з введених даних */
  num.get (iit, std::istreambuf_iterator<wchar_t>(), wcin, iState, years) ;
  
  if (! (iState & ios_base::goodbit) )
  {
    /* виводимо прочитані повідомлення */
    cout << "Вам " << years << " років" << endl ;
  }
  else
  {
    cerr << "Помилка при читанні!" << endl ;
  }
  
  return 0 ;
}
Вивід програми наступний: cpp_std_num_get_sample1-cxx
Категорії: