Есть ли способ сделать pos_type и off_type быть int64_t с использованием признаков?

StackOverflow https://stackoverflow.com/questions/4719382

Вопрос

Я пытаюсь понять, что такое черты, например, выражения, как typedef typename traits_type::off_type off_type В реализации GNU fstream.

Этот вопрос возник, когда я работал с файлами более 2/4 ГБ. Я обнаружил, что перекомментирование библиотеки STL, с соответствующими флагами обычно решают большие проблемы с файлами.

Это было полезно?

Решение

Черты - это способ «добавить» свойства к существующим типам. Допустим, мы создаем тип контейнера, который содержит Typedef, чтобы сообщить о своем типе данных. Классическим способом будет:

template <class T>
struct Cont { typedef T contained_type; }

Это имеет недостаток, который мы должны создать для создания нашего класса, чтобы сдержать Typedef - например. Сторонние контейнеры и основные типы не могут быть использованы кодом, который предполагает Cont::contained_type тип. Таким образом, мы вводим структуру черт, которая добавляет в процесс косвенный характер:

template <class C>
struct container_traits; // this struct would contain the contained_type for container C

template <class T>
struct Cont { ... } // no typedef here

template <class T>
struct container_traits<Cont<T> >
{
  typedef T contained_type; // by this, we say that the contained_type of Cont<T> is T
};

template <class T, unsigned N>
struct container_traits<T[N]>
{
  // this is the advantage of traits - we can add information for arrays, which can have no member typedefs
  typedef T contained_type;
};

Alos, шаблон признаков может быть параметром алгоритмов, использующих его, который позволяет нам использовать разные признаки с одним типом данных (см. std::string учебный класс).

Тем не менее, я не верю, что черты во многом связаны с 64-битными системами.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top