Вдохновленный этим вопросом, я задумался о том, что является идеальным std::pair
должно выглядеть. Класс сжатой пары (например, boost) предоставляет пару, размер которой уменьшается, когда один из ее типов является пустым классом. Для сжатой пары требуются геттеры (first()
, second()
), чтобы скрыть тот факт, что элемент с пустым типом не существует.
Во-вторых, согласно документам C++: "Пары - это частный случай кортежа" , но они реализованы как отдельный класс. Почему бы не использовать частичные специализации шаблонов, такие как
template <typename ...Args> class tuple {};
template <typename T1, typename T2> class tuple<T1, T2> {}; // Implements a compressed pair
template <typename T1, typename T2> using pair = tuple<T1, T2>;
Кроме того, чтобы обеспечить более унифицированный API, можно было бы перегрузить std::get
и std::set
для pair
и отказаться от методов доступа first()
и second()
. А можно и то, и другое :)
Вопросы
Почему
std::pair
не является специализациейstd::tuple
?Когда можно использовать
std::pair
вместо сжатой пары? И даже если есть случаи, должна ли по умолчанию быть сжатая пара?Почему нет класса сжатого кортежа?
std::pair
был в стандарте задолго доstd::tuple
появился в C++11. - person Some programmer dude   schedule 16.06.2016std::pair
как специализациюstd::tuple
, оставив открытымиfirst
иsecond
. Хотя, возможно, это вызовет больше путаницы, чем того стоит. - person Judge   schedule 16.06.2016