Предположим, я использую функцию foo
, которая возвращает double
, но я работаю с float
s в моей программе (как обычно, например, во многих приложениях компьютерной графики).
Я не могу потрудиться переписать foo
для float
, потому что я не использую во многих местах, и пространство (и, возможно, также скорость) служебных данных не является достаточно значительным, чтобы оправдать время для этого. Сделать foo
шаблоном функции, который работает с несколькими типами, тоже не вариант, потому что функция из библиотеки.
У меня есть несколько вариантов решения этой ситуации:
1) Используйте функцию как есть:
float f = foo();
Это дает предупреждение компилятору о "возможной потере данных", которое я хотел бы устранить, потому что я уверен, что потеря точности не является проблемой в данном конкретном случае.
2) Явное приведение к плаванию:
float f = static_cast<float>(foo());
Устраняет предупреждение и дает читателю понять, что я здесь конвертирую в float, но затрудняет быстрое понимание происходящего, особенно когда строка становится длиннее или если мне нужно привести несколько параметров.
3) Напишите обертку, которая скрывает преобразование в число с плавающей точкой
float foo_float() { return static_cast<float>foo(); }
float f = foo_float();
Нет предупреждений и легче для чтения, чем (2), но потенциально приводит ко многим функциям / лямбдам, которые на самом деле не добавляют новых функций.
Хотелось бы знать:
- Есть ли еще способы справиться с этой ситуацией?
- Мне не хватает подводных камней в одном из трех подходов?
Обратите внимание, что та же проблема может возникать для целочисленных типов, когда я могу быть уверен, что результат функции соответствует меньшему типу, который я использую.