Отмечая тип возвращаемого значения как Y
и передавая int
в качестве второго параметра, вы четко указали, что Y
- это int
. Здесь не происходит никаких сюрпризов.
#include <iostream>
template <typename X, typename Y>
decltype(auto) big(const X& a, const Y& b) // return type can just be auto as well
{
return a > b ? a : b;
}
int main()
{
std::cout << big(32.8, 9) << '\n';
std::cout << big(9, 32.8) << '\n';
std::cout << big(32.8, 90) << '\n';
std::cout << big(90, 32.8) << '\n';
}
Это выводит все четыре правильных значения на экран.
https://godbolt.org/z/fyGsmo
Одна вещь, которая важно отметить, что это будет работать только для типов, которые можно сравнивать друг с другом, т. е. компилятор будет неявно преобразовывать один тип в другой для сравнения.
ВАЖНО : параметры должны быть взяты по ссылке, чтобы избежать неопределенного поведения. Это связано с типом возврата, который я упрямо придерживался. decltype(auto)
может возвращать ссылки на типы. Если вы возвращаете что-то локальное для функции (количество аргументов), вы получаете неопределенное поведение.