Уменьшение беспорядка в C ++ - PullRequest
2 голосов
/ 02 марта 2012

При программировании универсальных классов я получаю методы, загроможденные приведениями (в противном случае я получаю предупреждения, которые рассматриваются как ошибки для наших проектов):

template <typename floatType>
class foo
{
public:
  typedef floatType real_type;

  real_type bar()
  {
    real_type a = (real_type)0.5; // should I be using static_cast? Either way, the code becomes cluttered quickly
    real_type b = a + 0.6; // warning here for floatType = float

    real_type someLongEquation = a + ((real_type)0.5 * (real_type)100) + (real_type)17.0;

    return a + b + someLongEquation;
  }
};

int main()
{
  {
    foo<float> z;
    z.bar();
  }

  {
    foo<double> z;
    z.bar();
  }

  return 0;
}

Есть ли способ уменьшить этот беспорядок?

Обратите внимание, что я понимаю, что использую магические константы в someLongEquation. Даже если я выделю их, это увеличит беспорядок. В любом случае, вопрос не в этом:)

Ответы [ 2 ]

0 голосов
/ 02 марта 2012

Вы должны отделить магические константы и сохранить их в правильном родовом типе. Все кастинги будут ограничены этим местом. Теперь, когда (я думаю) C ++ 11 позволяет в инициализации класса нецелой const-статики это легко.

template <typename floatType>
class foo
{
public:
  typedef floatType real_type;

  static constexpr real_type A = real_type(0.5);
  static constexpr real_type B = real_type(0.6);
  static constexpr real_type C = real_type(100.0);
  static constexpr real_type D = real_type(17.0);

  real_type bar()
  {
    real_type a = A;
    real_type b = a + B;

    real_type someLongEquation = a + (A * C) + D;

    return a + b + someLongEquation;
  }
};
0 голосов
/ 02 марта 2012

Простым способом было бы просто отключить предупреждение вокруг кода.С MSVC:

#pragma warning(push) // save warnings state
#pragma warning(disable:4244) // narrowing conversion
// code here ...
#pragma warning(pop) // restore warnings

Однако лучшим способом было бы просто использовать float литералы, если вам не нужна расширенная точность double для ваших магических констант.Просто добавьте f к литералам с плавающей запятой, и все будет в порядке.Кроме того, для 100 не требуется каст.Если вам действительно нужна точность, вернитесь к отключению предупреждения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...