Есть ли способ сделать pos_type и off_type int64_t, используя черты? - PullRequest
0 голосов
/ 18 января 2011

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

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

1 Ответ

1 голос
/ 18 января 2011

Черты - это способ «добавления» свойств к существующим типам.Допустим, мы создаем тип контейнера, который содержит 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-битными системами.

...