#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);
}
Здесь я использую шаблоны в CPP, поэтому, когда я вызываю функцию, big
обходя аргументы типа double
и int
, я хочу получить ответ, который есть double
. Тип здесь, он возвращает 32
вместо 32.8
.
Как получить желаемый результат? Как написать правильный тип возвращаемого значения big
функции?
c++
function
templates
return-type
function-templates
Ракшанда Мешрам
источник
источник
std::max
это реализовано. Тип возврата функции должен быть известен во время компиляции в C ++. Таким образом, этот тип возврата не может зависеть от значения времени выполнения ваших параметров. Вот почему для такой функции вам нужно, чтобы оба параметра имели одинаковый тип (т. Е. Имели тип X, но не Y).Ответы:
Функция может иметь только один тип возвращаемого значения, который должен быть известен во время компиляции. Тем не менее, вы можете использовать
std::common_type
, чтобы вернуть тип, в который оба параметра могут быть безразлично преобразованы.Это было бы
И чтобы проверить, что он на самом деле возвращает a
double
когда передано aint
и a,double
мы можем сделать:Какие отпечатки
PS:
std::common_type
может использовать троичного оператора за кулисами, и, таким образом, это решение не сильно отличается от других ответов (auto
+ троичный). Реальная сила вstd::common_type
том, что он принимает любое количество параметров.источник
Тип возврата должен быть определен во время компиляции. Вы можете использовать конечный возврат с условным оператором , если вы ограничены в C ++ 11 .
Смотреть в прямом эфире
Однако, если у вас есть доступ к c ++ 14 или выше,
auto
достаточно возврата, поскольку компилятор выведет правильный тип, если вы используете его вместе с условным оператором, следующим образом:Смотреть в прямом эфире
источник
const
).Помечая тип возвращаемого значения как
Y
и передаваяint
второй параметр, вы четко указали, чтоY
этоint
. Здесь нет никаких сюрпризов.Это выведет все четыре правильных значения на экран.
https://godbolt.org/z/fyGsmo
Важно отметить, что это будет работать только для типов, которые можно сравнивать друг с другом, т. Е. Компилятор неявно преобразует один тип в другой для сравнения.
ВАЖНО : параметры должны быть взяты по ссылке, чтобы избежать неопределенного поведения. Это связано с типом возврата, который я упрямо придерживался.
decltype(auto)
может возвращать ссылки на типы. Если вы возвращаете что-то локальное для функции (количество аргументов), вы получаете неопределенное поведение.источник
Это не правильное решение для вашей конкретной ситуации, по всей вероятности - другие ответы, вероятно, будут гораздо ближе к тому, что вы хотите.
Однако, если вам действительно нужно по какой-то причине возвращать совершенно разные типы во время выполнения, правильным решением (начиная с c ++ 17 ) является использование a
std::variant
, что является своего рода безопасным для типов объединением.Обратите внимание, что тогда на вызывающей стороне лежит обязанность иметь дело с возвращаемым значением, скорее всего, с использованием
std::visit
или тому подобное.источник
Он возвращает int, потому что Y является int, и он возвращает ему 32.8. Когда вы вызываете big 32,82 - это число с плавающей точкой, но 8 - это int, а тип возвращаемого значения - Y, который также является int.
Вы не можете исправить это, так как вам нужно знать во время выполнения, какой тип возвращает большие значения, поэтому создайте a и b одинакового типа:
источник