Как передать значение с плавающей запятой в функцию, принимая в качестве значения double - PullRequest
5 голосов
/ 22 февраля 2012

У меня есть функция, чей прототип выглядит так:

void example (double &var);

Но моя проблема в том, что мне может потребоваться вызвать функцию с некоторыми значениями с плавающей запятой. например,

float temp=10.1;

example(temp)

Если я сделаю это, мой код не скомпилируется, возможно, из-за передачи значения с плавающей запятой в переменную с двойной ссылкой.

Я хочу избежать написания перегруженной функции для double и float.

Может кто-нибудь предложить более чистый / лучший способ реализовать это?

Функция - это в основном усеченная функция, которая обрезает заданный ввод и да, оригинал изменен.

Спасибо.

Ответы [ 4 ]

5 голосов
/ 22 февраля 2012

Как насчет функции шаблона?

template <typename T>
void example (T &var);

Компилятор заменит как float, так и double использования (имейте в виду, что шаблоны C ++ являются макросами с безопасностью типов)

3 голосов
/ 22 февраля 2012

Передача мелких типов по ссылке не рекомендуется. Тебе лучше иметь что-то вроде double example(double var);. Это решит и вашу проблему.

перед:

void example(double& d);

double d = ...;
example(d); // unclear if d was modified

после

double example(double d);

double d = ...;
d = example(d);

float f = ...;
f = static_cast<float>( example(f) ); // cast required to tell the compiler to allow
                                       // the precision loss
2 голосов
/ 22 февраля 2012

Вы можете создать шаблон.

template<typename T>
void example (T &var)
0 голосов
/ 22 февраля 2012

Решение зависит от того, что именно example делает.

  • Меняет ли оно значение, переданное по ссылке?Если да, вы не можете передать ему float.Передача с помощью принудительного преобразования скомпилируется, но завершится сбоем во время выполнения (поскольку вы будете пропускать 4 байта, где необходимо 8 байтов).
  • Если значение не меняется, вы можете просто добавить к нему атрибут const и передать любой базовый тип данных.Это было бы: void example (const double &var);.Если преобразование возможно (поскольку оно теперь обрабатывается как (double)), компилятор не будет жаловаться.
  • Создание шаблона функции может работать, а может и не работать, и это полностью зависит от того, какая функция выполняет.
...