BOOST C++: заголовочный файл <boost/compressed_pair.hpp>

Все содержимое хидера <boost/compressed_pair.hpp> объявлено в пространстве имен boost.

Класс 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 являются одинаковыми, тогда тогда объявляется единственный конструктор с одним аргументом, и этот конструктор инициализирует обе величины в паре одним переданным значением.

Заметьте, что compressed_pair не может быть конкретизирован, если любой из аргументов шаблона является типом union, до тех пора пока не будет поддержки компилятора для boost::is_union, или если boost::is_union не специализирован для данного типа union.

Наконец, предупреждение для пользователей Visual C++ 6: если любой из аргументов является пустым типом, тогда присваивание этому члену вызовет порчу памяти (memory corruption), если этот пустой тип не имеет хотя бы пустой ("do nothing") оператор присваивания. Виноват в этом баг в VC6 с генерацией операторов присваивания по умолчанию.


Revised 08 May 2001

© Copyright boost.org 2000. Permission to copy, use, modify, sell and distribute this document is granted provided this copyright notice appears in all copies. This document is provided "as is" without express or implied warranty, and with no claim as to its suitability for any purpose.

Based on contributions by Steve Cleary, Beman Dawes, Howard Hinnant and John Maddock.

Maintained by John Maddock, the latest version of this file can be found at www.boost.org, and the boost discussion list at www.yahoogroups.com/list/boost.

 

последняя правка: 14.05.2005

библиотека BOOST C++ http://www.boost.org
перевод Elijah Koziev www.solarix.ru

  © Mental Computing 2010