Est-il possible de déclarer deux variables de types différents dans le corps d'initialisation d'une boucle for en C ++?
Par exemple:
for(int i=0,j=0 ...
définit deux entiers. Puis-je définir un int
et un char
dans le corps d'initialisation? Comment cela se ferait-il?
c++
scope
declaration
for-loop
Nathan Osman
la source
la source
-std=c++0x
) sous la forme defor(auto i=0, j=0.0; ...
, mais cette possibilité a été supprimée dans g ++ - 4.5 pour coïncider avec les textes c ++ 0x.Réponses:
C ++ 17 : Oui! Vous devez utiliser une déclaration contraignante structurée . La syntaxe est prise en charge dans gcc et clang depuis des années (depuis gcc-7 et clang-4.0) ( exemple live clang ). Cela nous permet de décompresser un tuple comme ceci:
Ce qui précède vous donnera:
int i
mis à1
double f
mis à1.0
std::string s
mis à"ab"
Assurez-vous de
#include <tuple>
ce type de déclaration.Vous pouvez spécifier les types exacts à l'intérieur du
tuple
en les tapant tous comme je l'ai fait avec lestd::string
, si vous voulez nommer un type. Par exemple:Une application spécifique de cela est l'itération sur une carte, l'obtention de la clé et de la valeur,
Voir un exemple en direct ici
C ++ 14 : vous pouvez faire la même chose que C ++ 11 (ci-dessous) avec l'ajout de type
std::get
. Donc, au lieu destd::get<0>(t)
dans l'exemple ci-dessous, vous pouvez avoirstd::get<int>(t)
.C ++ 11 :
std::make_pair
vous permet de le faire, ainsi questd::make_tuple
pour plus de deux objets.std::make_pair
renverra les deux arguments dans unstd::pair
. Les éléments sont accessibles avec.first
et.second
.Pour plus de deux objets, vous devrez utiliser un
std::tuple
std::make_tuple
est un modèle variadique qui va construire un tuple de n'importe quel nombre d'arguments (avec quelques limitations techniques bien sûr). Les éléments sont accessibles par index avecstd::get<INDEX>(tuple_object)
Dans les corps de boucle for, vous pouvez facilement aliaser les objets, même si vous devez toujours utiliser
.first
oustd::get
pour la condition de boucle for et l'expression de mise à jourC ++ 98 et C ++ 03 Vous pouvez nommer explicitement les types de a
std::pair
. Il n'y a pas de moyen standard de généraliser cela à plus de deux types:la source
make_
et écrirestd::pair(1, 1.0)
.Non - mais techniquement, il existe une solution de contournement (pas que je l'utilise en fait à moins d'y être forcé):
la source
struct { int a=0; char b='a'; } s;
Pas possible, mais vous pouvez faire:
Ou, limitez explicitement la portée
f
et l'i
utilisation de supports supplémentaires:la source
Vous ne pouvez pas déclarer plusieurs types dans l'initialisation, mais vous pouvez attribuer à plusieurs types EG
Déclarez-les simplement dans leur propre champ d'application.
la source
Je pense que la meilleure approche est la réponse de xian .
mais...
# Imbriqué pour la boucle
Cette approche est sale, mais peut résoudre toutes les versions.
donc je l'utilise souvent dans les fonctions macro.
Supplémentaire 1.
Il peut également être utilisé pour
declare local variables
etinitialize global variables
.Supplémentaire 2.
Bon exemple: avec fonction macro.
(Si la meilleure approche ne peut pas être utilisée car il s'agit d'une macro for-loop)
# Astuce if-statement
Si vous souhaitez initialiser à
0
ounullptr
, vous pouvez utiliser cette astuce.mais je ne le recommande pas à cause d'une lecture difficile.
et cela ressemble à un bug.
la source
Voir « Existe-t-il un moyen de définir des variables de deux types dans la boucle for? » Pour une autre méthode impliquant l'imbrication de plusieurs boucles. L'avantage de l'autre sens par rapport au "struct trick" de Georg est qu'il (1) vous permet d'avoir un mélange de variables locales statiques et non statiques et (2) il vous permet d'avoir des variables non copiables. L'inconvénient est qu'il est beaucoup moins lisible et peut être moins efficace.
la source
Définissez une macro:
N'oubliez pas que vos étendues variables ne seront pas non plus dans la boucle for de cette façon.
la source
{
et}
.Vous pouvez également utiliser comme ci-dessous en C ++.
la source