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

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?

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:

[code]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

}[/code]

seria bem melhor algo como:

[code]void write( void *value ) {
out << *static_cast< discoverType(value) >(value);

//outros procedimentos referentes a função de escrita

}[/code]
mas daí precisaria de uma função que retorna diferentes tipos.

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&lt;int *&gt;(VAR) POS_CODE \ break; \ case 2: \ PRE_CODE static_cast&lt;std::string *&gt;(VAR) POS_CODE \ break; \ }

sua utilização fica como:

UNIVERSAL_CAST( discoverType(value), out &lt;&lt; *,value,; )

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

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)

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?

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.

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.