Есть ли способ сделать pos_type и off_type быть int64_t с использованием признаков?
-
12-10-2019 - |
Вопрос
Я пытаюсь понять, что такое черты, например, выражения, как 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-битными системами.