Можно ли объявить две переменные разных типов в теле инициализации цикла for в C ++?
Например:
for(int i=0,j=0 ...
определяет два целых числа Могу ли я определить int
и char
в теле инициализации? Как это будет сделано?
c++
scope
declaration
for-loop
Натан Осман
источник
источник
-std=c++0x
) в формеfor(auto i=0, j=0.0; ...
, но эта возможность была удалена в g ++ - 4.5, чтобы совпадать с текстами c ++ 0x.Ответы:
C ++ 17 : Да! Вы должны использовать объявление структурированной привязки . Синтаксис поддерживается в gcc и clang в течение многих лет (начиная с gcc-7 и clang-4.0) ( живой пример clang ). Это позволяет нам распаковать кортеж так:
Вышеуказанное даст вам:
int i
установлен в1
double f
установлен в1.0
std::string s
установлен в"ab"
Обязательно
#include <tuple>
для такого рода деклараций.Вы можете указать точные типы внутри
tuple
, напечатав их все как у меняstd::string
, если вы хотите назвать тип. Например:Конкретным применением этого является итерация по карте, получение ключа и значения,
Смотрите живой пример здесь
C ++ 14 : вы можете сделать то же самое, что и C ++ 11 (ниже), с добавлением типов на основе
std::get
. Таким образом, вместоstd::get<0>(t)
приведенного ниже примера, вы можете иметьstd::get<int>(t)
.C ++ 11 :
std::make_pair
позволяет сделать это, а такжеstd::make_tuple
для более чем двух объектов.std::make_pair
вернет два аргумента вstd::pair
. Элементы могут быть доступны с помощью.first
и.second
.Для более чем двух объектов вам нужно использовать
std::tuple
std::make_tuple
шаблон с переменным числом аргументов, который будет создавать кортеж из любого числа аргументов (с некоторыми техническими ограничениями, конечно). Элементы могут быть доступны по индексу сstd::get<INDEX>(tuple_object)
В теле цикла for вы можете легко создавать псевдонимы для объектов, хотя вам все равно нужно использовать
.first
илиstd::get
для условия цикла for и выражения updateC ++ 98 и C ++ 03 Вы можете явно назвать типы a
std::pair
. Не существует стандартного способа обобщить это более чем на два типа:источник
make_
и написатьstd::pair(1, 1.0)
.Нет, но технически есть обходной путь (не то, чтобы я использовал его, если бы не был вынужден):
источник
struct { int a=0; char b='a'; } s;
Не возможно, но вы можете сделать:
Или явно ограничьте область применения
f
иi
используйте дополнительные скобки:источник
Вы не можете объявить несколько типов при инициализации, но вы можете назначить несколько типов EG
Просто объявите их в своей области видимости.
источник
Я думаю, что лучший подход - это ответ Сианя .
но...
# Вложено для цикла
Этот подход грязен, но может решить любую версию.
поэтому я часто использую его в макросах.
Дополнительный 1.
Это также может быть использовано для
declare local variables
иinitialize global variables
.Дополнительный 2.
Хороший пример: с функцией макроса.
(Если лучший подход не может быть использован, потому что это макрос for-loop)
Трюк с оператором if
Если вы хотите инициализировать в
0
илиnullptr
, вы можете использовать этот трюк.но я не рекомендую это из-за жесткого чтения.
и это похоже на ошибку.
источник
См. « Есть ли способ определить переменные двух типов в цикле for? », Чтобы узнать о другом способе, заключающемся во вложении нескольких циклов for. Преимущество другого способа перед «структурным трюком» Георга состоит в том, что он (1) позволяет вам иметь смесь статических и нестатических локальных переменных и (2) позволяет иметь непереписываемые переменные. Недостатком является то, что он гораздо менее читабелен и может быть менее эффективным.
источник
Определите макрос:
Просто помните, что ваши переменные области также не будут в цикле for.
источник
{
и}
.Также вы можете использовать, как показано ниже в C ++.
источник