Включение использования функции с логической переменной и значением - PullRequest
0 голосов
/ 13 февраля 2019

Иногда в классе, который реализует своего рода алгоритм, я бы хотел, чтобы пользователь мог включить или отключить определенную функцию, скажем, масштабирование некоторых входных значений.Иногда я вижу следующий код для этого (со значениями bool / float, установленными в конструкторе):

class A
{
private:
  bool enableScaling;
  float scaleFactor;

public:
  float foo(float x) const {
    ...

    if(enableScaling) {
      x *= scaleFactor;
    }

    ...
  }
};

Две переменные для этой цели мне не понятны, и я ищу советы для таких ситуаций.

В случае масштаба, я могу вообще опустить булеву переменную и установить значение по умолчанию scaleFactor = 1.0f (нейтральное), и я думаю, это будет хорошо для меня.Иногда «значение параметра функции» может быть только положительным, поэтому я мог бы установить его значение по умолчанию -1, чтобы показать, что это значение отключено, но иногда это не так (все значения допустимы).

Как вы подходите к таким ситуациям в целом?

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Каков ваш подход к таким ситуациям в целом?

На этот вопрос нельзя ответить раз и навсегда, это зависит от обстоятельств, возможны другие варианты, позволяющие изменить поведениевашего класса и т. д. (как вы уже сказали, целочисленное значение -1 может иметь смысл указывать на особый случай, если допустимый диапазон является положительным или неотрицательным).

Однако вы описываете общеесценарий, который может быть обработан единообразным способом, т. е. у вас есть определенное значение, которое может изменить поведение вашего класса, но только если оно установлено / присутствует.В этом случае используйте std::optional (или, если вы не можете использовать C ++ 17, boost :: необязательный ) элемент данных, хранящий рассматриваемое значение (или нет).).Он добавляет нулевое состояние к вашему члену данных, выражая именно то, чего вы пытались достичь: если значение есть, используйте его, иначе - нет.Это более выразительно, потому что оно документирует ваше намерение, а не полагается на определенное значение.

0 голосов
/ 13 февраля 2019

Вы можете свернуть enableScaling и scaleFactor до std::optional<scaleFactor>.

Это путь C ++ 17.

До этого boost::optional был выбором.

В вашем конкретном случае по умолчанию scaleFactor - 1.0f - вариант, так как умножение float на 1.0f должно сохранить исходный float по стандарту IEEE754 (при условии, что ваша платформа соответствуетчто).

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