C ++ 17 : Да! Вы должны использовать объявление структурированной привязки . Синтаксис поддерживается в gcc-7 и clang-4.0 ( clang live example ). Это позволяет нам распаковать кортеж так:
for (auto [i, f, s] = std::tuple{1, 1.0, std::string{"abc"}}; i < N; ++i) {
// ...
}
Сказанное выше даст вам:
int i
установлено на 1
double f
установлено на 1.0
std::string s
установлено на "abc"
Обязательно #include <tuple>
для такого рода декларации.
Вы можете указать точные типы внутри tuple
, напечатав их все как у меня с std::string
, если вы хотите назвать тип. Например:
auto [vec, i32] = std::tuple{std::vector<int>{3, 4, 5}, std::int32_t{12}}
C ++ 14 : Вы можете сделать то же самое, что и C ++ 11 (ниже), с добавлением основанного на типе std::get
. Таким образом, вместо std::get<0>(t)
в приведенном ниже примере вы можете иметь std::get<int>(t)
.
C ++ 11 : std::make_pair
позволяет вам сделать это, а также std::make_tuple
для более чем двух объектов.
for (auto p = std::make_pair(5, std::string("Hello World")); p.first < 10; ++p.first) {
std::cout << p.second << std::endl;
}
std::make_pair
вернет два аргумента в std::pair
. Элементы могут быть доступны с .first
и .second
.
Для более чем двух объектов вам нужно использовать std::tuple
for (auto t = std::make_tuple(0, std::string("Hello world"), std::vector<int>{});
std::get<0>(t) < 10;
++std::get<0>(t)) {
std::cout << std::get<1>(t) << std::endl; // cout Hello world
std::get<2>(t).push_back(std::get<0>(t)); // add counter value to the vector
}
std::make_tuple
- это шаблон переменной, который будет создавать кортеж из любого числа аргументов (с некоторыми техническими ограничениями, конечно). Элементы могут быть доступны по индексу с std::get<INDEX>(tuple_object)
В теле цикла for вы можете легко создавать псевдонимы для объектов, хотя вам все равно нужно использовать .first
или std::get
для условия цикла for и выражения обновления
for (auto t = std::make_tuple(0, std::string("Hello world"), std::vector<int>{});
std::get<0>(t) < 10;
++std::get<0>(t)) {
auto& i = std::get<0>(t);
auto& s = std::get<1>(t);
auto& v = std::get<2>(t);
std::cout << s << std::endl; // cout Hello world
v.push_back(i); // add counter value to the vector
}
C ++ 98 и C ++ 03 Вы можете явно назвать типы std::pair
. Не существует стандартного способа обобщить это более чем на два типа:
for (std::pair<int, std::string> p(5, "Hello World"); p.first < 10; ++p.first) {
std::cout << p.second << std::endl;
}