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<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.
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.