[C++]É possível criar uma função que retorna diferentes tipos dependendo do valor do parametro?

6 respostas
DavidUser

Preciso de uma função que dados valores de parâmetros retorne um objeto de um tipo definido.

Com templates posso definir o tipo de retorno da função pelo tipo dos parâmetros de entrada:

template <typename T> T returnType(T in) { return T(); }
Seria possível definir o tipo de retorno pelo valor dos parâmetros?

6 Respostas

DavidUser

Trata-se de uma tentativa de evitar o problema da identificação de tipo dentro do corpo de uma função nível mais alto.

Não é nada elegante ter um switch-case em uma função complexa:
void write( void *value ) {
	switch( discoverType(value) ) {
	case 1:
		out << *static_cast< int * >(value);
		break;
	case 23:
		out << *static_cast< double * >(value);
		break;
	case 78:
		out << *static_cast< home * >(value);
		break;
	case 40:
		out << *static_cast< chair * >(value);
		break;
	}

	//outros procedimentos referentes a função de escrita
}
seria bem melhor algo como:
void write( void *value ) {
	out << *static_cast< discoverType(value) >(value);

	//outros procedimentos referentes a função de escrita
}
mas daí precisaria de uma função que retorna diferentes tipos.
DavidUser

A solução que encontrei até o momento foi com a criação de uma macro dessa forma:

#define UNIVERSAL_CAST(TYPE, PRE_CODE, VAR, POS_CODE) \ switch (TYPE) { \ case 1: \ PRE_CODE static_cast<int *>(VAR) POS_CODE \ break; \ case 2: \ PRE_CODE static_cast<std::string *>(VAR) POS_CODE \ break; \ }

sua utilização fica como:

UNIVERSAL_CAST( discoverType(value), out << *,value,; )

Não creio que seja a melhor solução, caso alguém encontre outra forma participe, responda este tópico.

ViniGodoy

Sim, é plenamente possível. O C++ irá criar uma função diferente para cada tipo utilizado.

O comando “discoverType” é praticamente impossível em C++ (há como fazer com cast e RTTI, mas não é garantido em múltiplas plataformas)

DavidUser

Como posso criar uma função que recebe um parametro int i e para i igual 1 retorna um int, para i igual 2 retorna std::string?

ViniGodoy

Ah, desculpe, agora sim entendi sua pergunta.
Isso aí não é possível.

Mas para que você quer isso?

Normalmente, você resolve esse problema com polimorfismo.

DavidUser

Estava tentando criar uma função de mapeamento dos OIDs da ODBC, conheço algumas OID como:
DATE = 1082
VARCHAR = 25
VARCHAROID = 1043
INT4OID = 23
INT8OID = 20

e preciva mapear VARCHAR* para tipo std::string e INT* para tipo int.

Criado 20 de outubro de 2012
Ultima resposta 20 de out. de 2012
Respostas 6
Participantes 2