tuple
не является волшебной заменой структуры. Их цели очень разные. Структура — это прежде всего языковая конструкция. tuple
— это библиотека.
Структуры должны иметь значения по умолчанию, потому что язык говорит, что вы можете написать конструкторы, чтобы дать им значения по умолчанию. Затем язык берет на себя ответственность за вызов этого конструктора для инициализации структуры. tuple
, как библиотека, не имеет таких возможностей, так же как вы не можете задать std::vector<T>
значение по умолчанию T
, которое всегда будет автоматически использоваться. Вы можете указать начальные значения для каждого члена, но не можете указать значения по умолчанию.
А если подумать, то и не захочется. Представьте, если бы кто-то мог сказать, что каждый tuple<int, float>
всегда создавался с помощью 3 и 54.221. Даже если бы его создал какой-то другой код, который ничего не знал об этом правиле, ему нужно было бы следовать (точно так же, как конструкторы для типа используются везде, где используется этот тип). Помните: все tuple<int, float>
относятся к одному типу.
На самом деле, tuple
заменяет невозможность выполнения отражения структуры и выполнения итераций во время компиляции по ее членам. Другая основная причина, по которой они существуют, заключается в том, чтобы иметь возможность иметь динамические структуры времени компиляции (то есть возможность создавать агрегаты типов на основе аргументов времени компиляции, а не статический список, записанный непосредственно в файл).
Поэтому, если вам не нужно использовать std::tie
(для эффективного возврата нескольких значений), итерации по членам (т.е.: вызывать некоторую функцию шаблона для каждого члена объекта) или какой-то аналогичный специализированный код, вы должны использовать структуру.
person
Nicol Bolas
schedule
09.11.2012
std::tr1::tuple
. Вы должны использоватьstd::tuple
(даже если это псевдонимusing
из пространства именtr1
, он может быть не позже. И ваш код будет совместим с миром не VS). - person Nicol Bolas   schedule 09.11.2012tuple
не имеет ровно ничего общего с STL (например: вызовvector
STL может быть приемлемым в некоторых ситуациях, потому что это было в STL.tuple
не было). - person Griwes   schedule 10.11.2012