Шаблонний клас std::time_put являється facet-властивістю локалі (похідний від класу locale::facet) і призначений для відображання форматованої дати згідно з вказаною локаллю у вказаний потік виводу. Оголошення класу виглядає приблизно наступним чином:
template <class charT, 
          class OutputIterator = ostreambuf_iterator<charT> >
class time_put ;
Параметр шаблону charT призначений для вказування типу символів, з якими буде працювати примірник. Параметр шаблону OutputIterator призначений для вказування типу ітератора, який буде використовуватись об'єктом для виводу даних у потік. Клас std::num_put містить приватний деструктор - користувачі не повинні створювати примірники безпосередньо даного класу, натомість, програми повинні створювати примірники дочірніх класів або використовувати наявні об'єкти, які прив'язані до об'єктів локалей. Стандартні примірники класу locale повинні підтримувати наступний мінімальний набір спеціалізованих примірників даного класу:
  • time_put<char> - призначений для роботи з звичайними байтовими символами і стандартним типом ітератора виводу;
  • time_put<wchar_t> - призначений для роботи з розширеним типом символів і стандартним типом ітератора виводу.
Клас містить константу типу locale::id, яка унікально ідентифікує об'єкти.

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

explicit time_put (size_t refs=0) ;
Конструктор класу. Параметр refs призначений для управління системою автоматичного видалення facet-об'єктів. Значення 0 (нуль) вказує на те, що об'єкт повинен бути видаленим коли видаляється останній прикріплений до нього об'єкт класу locale. Значення 1 вказує, що об'єкт не повинен автоматично видалятися.
iter_type put (iter_type s, 
               ios_base& str, 
               char_type fill, 
               const tm* t,
               const char_type* pattern, 
               const char_type* pat_end) const ;

iter_type put (iter_type s, 
               ios_base& str, 
               char_type fill, 
               const tm* t,
               char format, 
               char modifier = 0) const ;
Метод вставляє послідовність символів, що відображають вказану дату, у потік виводу на який вказує переданий ітератор. Параметр s призначений для вказування місця, куди будуть вставлятися результуючі символи. Параметр str призначений для передачі об'єкта, клас якого похідний від ios_base (зазвичай це потоковий об'єкт виводу) і використовується для отримання інформації про форматування. Параметр fill призначений для вказування символу, що буде заповнювати місце, не повністю заповнене значенням вказаної дати. Параметр t призначений для передачі вказівника на структуру struct tm (оголошена у файлі ctime або time.h), і яка містить дату, що потрібно відформатувати і вставити у потік виводу. Параметри pattern i patt_end призначені для вказування символів форматування і звичайних символів, які необхідно обробити і вставити у потік виводу. Параметр format призначений для вказування опцій форматування в одній змінній (повинен відповідати одному з параметрів, переданих до функції strftime). Параметр modifier призначений для вказування модифікатора форматування, дозволяється деякими платформами. Метод повертає ітератор, який вказує на елемент, що стоїть після останнього символу вставленого у потік виводу даним методом.

Приклад

Простий приклад використання класу.
#include <locale> /* time_put і все корисне */
#include <string.h> /* memset */
#include <time.h> /* time_t, time, tm */
#include <iterator>
#include <iostream> /* об'єкт wcout */
using namespace std ; /* друкуємо без std */

/* головна функція програми */
int main (int argc, char** argv)
{
  /* створюємо бажану локаль 
  ** вказану користувачем */
  locale loc ("uk_UA.UTF-8") ;
  
  /* перевіряємо присутність потрібного нам facet-об'єкта */
  if (!has_facet< time_put<wchar_t> > (loc))
  {
    /* якщо facet-об'єкт відсутній - 
    ** виводимо повідомлення і 
    ** завершуємо роботу програми */
    /* УВАГА! Кирилиця може некоректно відображатись 
    ** у терміналах, які не підтримують UTF-8!!! */
    cout << "Локаль " << loc.name() << " немає time_put<wchar_t>." ;
    
    return 0 ;
  }
  
  /* отримуємо необхідний примірник time_put */
  const time_put<wchar_t>& tp = use_facet < time_put<wchar_t> > (loc) ;
  
  /* ітератори вводу */
  ostreambuf_iterator<wchar_t> oit (wcout.rdbuf()) ;
  //ostreambuf_iterator<wchar_t> oite ;
  /* змінна для утримування значення помилки */
  ios_base::iostate err = ios_base::goodbit ;
  
  /* отримуємо поточний час */
  time_t timestamp ;
  time (&timestamp) ;
  tm* now = localtime (&timestamp) ;
  
  /* виводимо дату у термінал */
  tp.put (oit, wcout, ' ', now, 'F') ;
  
  /* виводимо новий рядок */
  wcout << endl ;
  
  return 0 ;
}
Вивід програми: cpp_std_time_put_sample1-cxx Виникає одне питання: навіщо даному класу параметри форматування на подобі тих, які передаються strftime? Клас не повинен "знати", як виводити дату згідно вказаної локалі?
Категорії: