Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

José Enésio

[Tutorial] Loop foreach em C++

Recommended Posts

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;
		}
	}
}

Só que esse código é meio sem graça. Vamos adicionar uma cafetinagem nele!

 

#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;
}
bool preencheoutros(int ignora, int indice, int* outros)
{
	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;
}

Valeu gurizada!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muuuuito bom!

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

 

parabéns pela idéia!

 

o único problema é criar uma função overloaded para cada função que será chamada na "*call"... :P

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.