Есть ли более элегантное приведение от int к float, чем static_cast <float>? - PullRequest
1 голос
/ 30 мая 2020

Я разработчик. NET пытается сделать c ++ (кхм), и я обнаружил здесь предупреждение компилятора:

const auto u = (textel.character % font_glyph_column_count) * font_glyph_size; // <- all int
const auto v = (textel.character / font_glyph_column_count) * font_glyph_size; // <- all int
const auto top_left_uv = sf::Vector2f(u, v);

В последней строке, где 'u' и 'v' передаются как аргументы в вектор ctor, компилятор говорит:

преобразование из 'const int' в 'T', возможная потеря данных

Хорошо,. NET этого не делает, но я посмотрел и понял, что не все int32 могут быть представлены в виде числа с плавающей запятой. (Теперь мне интересно, почему. NET не предупреждает об этом :))

Итак, мое решение, вдохновленное. NET, - по-видимому, называется - «C cast», на что жалуется мой Resharper about: итак, я меняю его на static_cast. Окидо ...

const auto u = static_cast<float>(textel.character % font_glyph_column_count) * font_glyph_size;
const auto v = static_cast<float>(textel.character / font_glyph_column_count) * font_glyph_size;
const auto top_left_uv = sf::Vector2f(u, v);

Но юк! теперь мой код arithmeti c засорен этими приведениями, в то время как жонглирование целочисленными вычислениями очень преднамеренное, и необходимость помещать результат в векторы на основе float также необходима ...

Я мог бы изменить например. font_glyph_size в число с плавающей запятой, поэтому приведение типов становится неявным, но имеет смысл использовать дискретное количество пикселей, поэтому int ...

Можно ли сделать этот код красивее?

1 Ответ

0 голосов
/ 30 мая 2020

Вы можете использовать c stryle cast.

int a = 1; float b = (float) a;

Также вы можете сделать просто

int a = 1; поплавок b = a;

...