É possível declarar duas variáveis de tipos diferentes no corpo de inicialização de um loop for em C ++?
Por exemplo:
for(int i=0,j=0 ...
define dois números inteiros. Posso definir um int
e um char
no corpo de inicialização? Como isso seria feito?
c++
scope
declaration
for-loop
Nathan Osman
fonte
fonte
-std=c++0x
) na forma defor(auto i=0, j=0.0; ...
, mas essa possibilidade foi removida em g ++ - 4.5 para coincidir com os textos c ++ 0x.Respostas:
C ++ 17 : Sim! Você deve usar uma declaração de ligação estruturada . A sintaxe é suportada no gcc e no clang há anos (desde gcc-7 e clang-4.0) ( exemplo ao vivo do clang ). Isso nos permite descompactar uma tupla assim:
O exposto acima lhe dará:
int i
definido como1
double f
definido como1.0
std::string s
definido como"ab"
Certifique-se de
#include <tuple>
que este tipo de declaração.Você pode especificar os tipos exatos dentro do
tuple
, digitando todos eles como eu fiz com ostd::string
, se desejar nomear um tipo. Por exemplo:Uma aplicação específica disso está iterando sobre um mapa, obtendo a chave e o valor,
Veja um exemplo ao vivo aqui
C ++ 14 : você pode fazer o mesmo que o C ++ 11 (abaixo) com a adição de tipos
std::get
. Então, em vez destd::get<0>(t)
no exemplo abaixo, você pode terstd::get<int>(t)
.C ++ 11 :
std::make_pair
permite fazer isso, alémstd::make_tuple
de mais de dois objetos.std::make_pair
retornará os dois argumentos em astd::pair
. Os elementos podem ser acessados com.first
e.second
.Para mais de dois objetos, você precisará usar um
std::tuple
std::make_tuple
é um modelo variável que construirá uma tupla de qualquer número de argumentos (com algumas limitações técnicas, é claro). Os elementos podem ser acessados por índice comstd::get<INDEX>(tuple_object)
Dentro dos corpos do loop for, você pode facilmente alias os objetos, embora ainda precise usar
.first
oustd::get
para a condição do loop for e atualizar a expressãoC ++ 98 e C ++ 03 Você pode nomear explicitamente os tipos de a
std::pair
. Porém, não há uma maneira padrão de generalizar isso para mais de dois tipos:fonte
make_
e escreverstd::pair(1, 1.0)
.Não - mas tecnicamente há uma solução alternativa (não que eu realmente a use, a menos que seja forçado a):
fonte
struct { int a=0; char b='a'; } s;
Não é possível, mas você pode fazer:
Ou, limite explicitamente o escopo
f
e oi
uso de colchetes adicionais:fonte
Você não pode declarar vários tipos na inicialização, mas pode atribuir a vários tipos EG
Apenas declare-os em seu próprio escopo.
fonte
Eu acho que a melhor abordagem é a resposta de xian .
mas...
# Aninhado para loop
Essa abordagem é suja, mas pode ser resolvida em todas as versões.
então, costumo usá-lo em funções macro.
Adicional 1.
Também pode ser usado para
declare local variables
einitialize global variables
.2 adicionais.
Bom exemplo: com função macro.
(Se a melhor abordagem não puder ser usada porque é uma macro de loop for)
# Truque de declaração If
Se você deseja inicializar para
0
ounullptr
, pode usar este truque.mas eu não recomendo isso por causa da leitura difícil.
e parece um bug.
fonte
Consulte " Existe uma maneira de definir variáveis de dois tipos no loop for? " Para outra maneira que envolve o aninhamento de múltiplos loops. A vantagem da outra maneira sobre o "truque de estrutura" de Georg é que (1) permite que você tenha uma mistura de variáveis locais estáticas e não estáticas e (2) permite que você tenha variáveis não copiáveis. A desvantagem é que é muito menos legível e pode ser menos eficiente.
fonte
Defina uma macro:
Lembre-se de que seus escopos variáveis também não estarão dentro do loop for.
fonte
{
e}
.Também você pode usar como abaixo em C ++.
fonte