#include <iostream>
using namespace std;
template <class X, class Y>
Y big(X a, Y b)
{
if (a > b)
return (a);
else return (b);
}
int main()
{
cout << big(32.8, 9);
}
Aqui estou usando modelos no CPP; portanto, quando chamo a função big
ignorando argumentos de double
e int
digite, quero a resposta de retorno que é double
. O tipo aqui, ele retorna em 32
vez de 32.8
.
Como obtenho a saída desejada? Como escrever um tipo de retorno de big
função adequado ?
c++
function
templates
return-type
function-templates
Rakshanda Meshram
fonte
fonte
std::max
é implementado. O tipo de retorno de uma função deve ser conhecido em tempo de compilação em C ++. Portanto, você não pode ter esse tipo de retorno dependente do valor de tempo de execução dos seus parâmetros. É por isso que, para essa função, você precisa que os dois parâmetros tenham o mesmo tipo (ou seja, possuem o tipo X, mas não o Y).Respostas:
Uma função pode ter apenas um tipo de retorno que precisa ser conhecido no momento da compilação. No entanto, você pode usar
std::common_type
, para retornar um tipo no qual os dois parâmetros possam ser implicitamente convertidos.Isso seria
E para verificar se, na verdade, retorna a
double
quando passou aint
e adouble
, podemos fazer:Que imprime
PS:
std::common_type
pode usar o operador ternário por trás das notas e, como tal, esta solução não é muito diferente das outras respostas (auto
+ ternário). O poder realstd::common_type
é que ele aceita qualquer número de parâmetros.fonte
O tipo de retorno deve ser determinado em tempo de compilação. Você pode usar o retorno à direita com um operador condicional , se estiver limitado a c ++ 11 .
Ver ao vivo
No entanto, se você tiver acesso ao c ++ 14 ou superior, o
auto
retorno é suficiente, pois o compilador deduzirá o tipo certo se você o usar junto com o operador condicional da seguinte maneira:Ver ao vivo
fonte
const
).Ao marcar seu tipo de retorno como
Y
e passar umint
como seu segundo parâmetro, você indicou claramente queY
é umint
. Não há surpresas acontecendo aqui.Isso imprime todos os quatro valores corretos na tela.
https://godbolt.org/z/fyGsmo
Uma coisa que é importante observar é que isso funcionará apenas para tipos que podem ser comparados entre si, ou seja, o compilador converterá implicitamente um tipo em outro para a comparação.
IMPORTANTE : Os parâmetros precisam ser tomados por referência para evitar comportamento indefinido. Isso tem a ver com o tipo de retorno pelo qual estou teimosamente.
decltype(auto)
pode retornar referências a tipos. Se você retornar algo local para a função (contagem de argumentos), obterá um comportamento indefinido.fonte
Esta não é a solução correta para sua situação precisa, com toda a probabilidade - as outras respostas provavelmente estarão muito mais próximas do que você deseja.
No entanto, se você realmente precisar retornar tipos totalmente diferentes em tempo de execução por algum motivo, a solução correta (desde o c ++ 17 ) é usar a
std::variant
, que é uma espécie de união com segurança de tipo.Observe que o ônus está no chamador para lidar com o valor retornado, provavelmente usando
std::visit
ou algo parecido.fonte
Ele retorna int porque Y é um int e lança 32,8 para ele. Quando você chamou big 32,82, é float, mas 8 é int e o tipo de retorno da função é Y, que também é int.
Você não pode realmente consertar isso, pois precisa saber em tempo de execução que tipo retornos grandes, portanto, faça aeb do mesmo tipo:
fonte