2011-01-18 5 views
0

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

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

+0

Можете ли вы рассказать о том, какие именно «флаги» вы использовали и почему вы их использовали? Понимание особенностей поможет нам дать ответ, который имеет больше смысла для вас. Кроме того, вы должны указать, к чему относятся 'pos_type' и' off_type', о которых вы ссылаетесь в своем названии. – JaredC

+0

Я решил проблему с большой поддержкой файлов, этот вопрос не об этом. Теперь я пытаюсь понять, каковы черты и как их использовать в STL. Что касается вашего вопроса, я добавил некоторые объяснения. – Ali

ответ

1

Черты - это способ добавления свойств к существующим типам. Предположим, мы создаем тип контейнера, который содержит typedef для указания его содержимого. Классический способ будет:

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

Это имеет тот недостаток, что мы должны создать наш класс только содержать ЬурейеЕ - например. сторонние контейнеры и базовые типы не могут использоваться кодом, который предполагает тип 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-битными системами.

+0

Спасибо за подробное объяснение! Что касается «Я не верю, что черты имеют много общего с [..] off_type», я посмотрел на реализацию GNU и нашел: typedef typename traits_type :: off_type off_type. Что здесь означают черты? – Ali

+1

ОК, 'off_type' определяется классом признаков. Я просто подумал, что вам не нужно менять свойства в любом случае на 64-битных системах, стандартные типы должны работать. Обратите внимание, что, например. классы потоков с разными признаками являются разными типами и будут мешать друг другу (например, 'cin' и' wcin'). – jpalecek