Лично я бы здесь пропустил std::array
/ std::vector
, потому что в вашем конкретном случае позиция каждого значения накладывает независимое значение.Как правило, типы последовательности имеют порядок, tuple
имеют структуру;если количество элементов является фиксированным (и часто неоднородным), а сортировка (или иным образом переупорядочение значений) по своей сути бессмысленна (например, в случае координаты, при перестановке значений x
и y
изменяется значение , означающее ), тогда tuple
имеет больше смысла.
В этом случае вы можете просто объявить:
std::tuple<float, float, float> getPos() {
// C++17 or higher allows list initialization
return {x, y, z};
// Pre-C++17 you use the std::make_tuple helper
return std::make_tuple(x, y, z);
}
Преимущество заключается в том, что вы можете затем распаковать результат в вызывающей программе.легко, с помощью std::tie
:
float x, y, z;
std::tie(x, y, z) = a.getPos();
или на C ++ 17 или выше со структурированными привязками, это даже лучше, поскольку вы можете объявлять и инициализировать переменные с помощью auto
, а не объявлять с помощьюявные типы, затем переназначение с помощью tie
:
auto [x, y, z] = a.getPos();
Вы можете сохранить сам tuple
и использовать std::get
, если хотите, но распаковка под полезными именами вместо неясных std::get
индексов обычно делаетдля более чистого кода.