Steve Cleary
Beman Dawes
Howard Hinnant
John Maddock
Copyright © 2000 Steve Cleary, Beman Dawes, Howard Hinnant & John
Maddock
Содержание<<boost/compressed_pair.hpp>
>определяется внутри<namespaceboost
>.
Класс<compressed_pair
>очень похож на<std::pair
>, но если любой из аргументов шаблона является пустым классом, топустая оптимизация базового классаприменяется для сжатия размера пары.
template <class T1, class T2>
class compressed_pair
{
public:
typedef T1 first_type;
typedef T2 second_type;
typedef typename call_traits<first_type>::param_type first_param_type;
typedef typename call_traits<second_type>::param_type second_param_type;
typedef typename call_traits<first_type>::reference first_reference;
typedef typename call_traits<second_type>::reference second_reference;
typedef typename call_traits<first_type>::const_reference first_const_reference;
typedef typename call_traits<second_type>::const_reference second_const_reference;
compressed_pair() : base() {}
compressed_pair(first_param_type x, second_param_type y);
explicit compressed_pair(first_param_type x);
explicit compressed_pair(second_param_type y);
compressed_pair& operator=(const compressed_pair&);
first_reference first();
first_const_reference first() const;
second_reference second();
second_const_reference second() const;
void swap(compressed_pair& y);
};
К двум членам пары можно получить доступ, используя функции<first()
>и<second()
>. Обратите внимание, что не все функции-члены могут быть реализованы для всех типов параметров шаблона. В частности,<compressed_pair
>может быть инстанцирован для эталонных и массивных типов, однако в этих случаях диапазон конструкторов, которые могут быть использованы, ограничен. Если типы<T1
>и<T2
>однотипны, то существует только одна версия одноаргументного конструктора, и этот конструктор инициализирует оба значения в паре к пройденному значению.
Обратите внимание, что если любой из членов является POD-типом, то этот член не является нулевым инициализируемым конструктором по умолчанию<compressed_pair
>: вы должны предоставить начальное значение для этих типов, если вы хотите, чтобы они имели значение по умолчанию.
Обратите внимание, что<compressed_pair
>не может быть инстанцирован, если один из аргументов шаблона является союзным типом, если нет поддержки компилятора<boost::is_union
>или если<boost::is_union
>специализируется на союзном типе.
Наконец, предостережение для пользователей Visual C++ 6: если любой аргумент является пустым типом, то назначение этого участника приведет к повреждению памяти, если пустой тип не имеет оператора назначения «ничего не делать». Это связано с ошибкой в том, как VC6 генерирует неявные операторы присваивания.
На основе вкладов Стива Клири, Бемана Доуса, Говарда Хиннанта и Джона Мэддока.
СохранилДжон Мэддок.