Почему std:: pair <A, B> не совпадает с std:: tuple <A, B>? (Неужели нет способа?)
Почему std::pair<A,B>
не совпадает с std::tuple<A,B>
? Всегда было странно не быть способным просто подставить друг друга. Они несколько конвертируемые, но есть ограничения.
Я знаю, что std::pair<A,B>
требуется иметь два элемента данных A first
и B second
, поэтому он не может быть просто псевдонимом типа std::tuple<A,B>
. Но моя интуиция говорит, что мы могли бы специализировать std::tuple<A,B>
, то есть кортеж с ровно двумя элементами, чтобы равняться определению того, что стандарт требует std::pair
. А затем перейдем к std::pair
.
Я предполагаю, что это было бы невозможно, так как слишком прямолинейно, чтобы не думать об этом, но это не было сделано в g++ libstdС++, например (я не смотрел исходный код других библиотек). Какова будет проблема этого определения? "Просто", что он нарушит стандартную бинарную совместимость библиотек?
Ответы
Ответ 1
Вы должны быть осторожны с такими вещами, как SFINAE и перегрузкой. Например, приведенный ниже код в настоящее время хорошо сформирован, но вы сделали бы его незаконным:
void f(std::pair<int, int>);
void f(std::tuple<int, int>);
В настоящее время я могу устранить неоднозначность между парой и кортежем посредством разрешения перегрузки, SFINAE, специализации шаблонов и т.д. Эти инструменты все равно станут несовместимыми с ними, если вы сделаете их одинаковыми. Это нарушит существующий код.
Возможно, появилась возможность представить его как часть С++ 11, но, безусловно, этого не происходит.
Ответ 2
Это чисто исторический. std::pair
существует с С++ 98, тогда как кортеж пришел и первоначально не был частью стандарта.
Обратная совместимость - самая большая нагрузка для развития С++, что позволяет легко справляться с некоторыми приятными делами!
Ответ 3
Я не пробовал это и сейчас не имею пропускную способность. Вы можете попробовать сделать специализацию std:: tuple, полученную из sd:: pair. Кто-то, пожалуйста, скажите мне, что это не сработает или будет особенно ужасной идеей. Я подозреваю, что у вас возникнут проблемы с аксессуарами.