Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Iae galera! Pra quem quiser dar uma brincada, fiz aqui um loop foreach em C++ que funciona com diversos tipos de array! O bagulho está altamente primitivo (como eu), e portanto algumas coisas não dá pra ser no automático kkkk
A moral é que tem que passar a array por parâmetro, lógico, tem que passar o tamanho dela em elementos (até dava pra fazer algo com sizeof, mas sizeof não mostra o tamanho real de arrays dinâmicas, então só ia funcionar nas arrays estilo int num[10];), e o nome de uma função criada anteriormente. Essa função deve retorna bool, e deve aceitar como parâmetro um dado do tipo da sua array, um int que será o índice, e opcionalmente um ponteiro para a array em questão (caso seja necessário modificá-la na função, por exemplo).
A função deve retornar bool pra simular um break: retorne true pra continuar e false para parar o foreach.
Quanto ao bagulho do tamanho da array, dá para resolver se tu criar uma classe Array (que contém junto o tamanho do bagulho) e adapte a função para ela apenas, ou pegue algum tipo que você tenha aí que já tenha isso junto.
Esse é o código:
template<class T> void foreach(T array, int datasize, bool (call)(T, int))
{
if(array == NULL || datasize < 1 || call == NULL)
{
return;
}
int x;
for(x = 0; x < datasize; x++)
{
if(!call(array[x], x))
{
break;
}
}
}
template<class T> void foreach(T* array, int datasize, bool (*call)(T, int, T*)) if(array == NULL || datasize < 1 || call == NULL)
{
return;
}
int x;
for(x = 0; x < datasize; x++)
{
if(!call(array[x], x, array))
{
break;
}
}
}#define SIZE ,
#define CALL ,
Coloque isso no topo do código. Agora teste. Olha que pimptype fica esse código!
#include <iostream>
#include "foreach.h"
bool fazosxizes(int xis, int indice)
{
std::cout << "xizes[" << indice << "] = " << xis << "\n";
return true;
} outros[indice] = indice + 1;
return true;
}
int main()
{
int xizes[10] = {1,2,3,4,5,6,7,8,9,10};
int *outros = NULL;
int quantos = 0, x;
foreach(xizes SIZE 10 CALL fazosxizes);
while(std::cout << "Quantos elementos quer agora?" && !(std::cin >> quantos))
{
std::cin.clear();
}
std::cin.ignore();
outros = new int[quantos];
foreach(outros SIZE quantos CALL preencheoutros);
foreach(outros SIZE quantos CALL fazosxizes);
delete[] outros;
outros = NULL;
std::cin.get();
return 0;
}Carregando comentários...