Проверка нулевого параметра C++
У меня есть функция, которая решает одно из 4 кинематических уравнений. Параметры являются числами с плавающей запятой, и есть ли способ отличить NULL-параметр от параметра со значением 0. Я прочитал тему, и кажется, что NULL и 0 одинаковы. Причина, по которой я хочу отличить 0 от формы "ничто", заключается в том, что значение 0 назначает значение, а "ничто" показывает, что мы не знаем, что это за значение.
float doSomething(float& foo, float& bar, float& goo, float& baz){
if(foo == (insert_null_value_here)){
return (foo_after_we_did_some_equation);
}
}
Значение "null" не может быть NULL или 0, как я уже обсуждал. Если бы все параметры были указателями на числа с плавающей запятой, сработало бы это, если бы я проверил наличие "nullptrs"?(Не мой главный вопрос) Даже если первый вопрос - "да", какое значение я могу использовать для не указателей / ссылочных типов? постановка основного вопроса)
2 ответа
Добавляя мои 2 цента здесь.
Вы также можете использовать указатели напрямую и отправлять nullptr для параметров, для которых вы не хотите отправлять значения. Это на тот случай, если вы не хотите включать Boost для незначительной функции.
Также вы не можете проверить ссылки на nullptr. По умолчанию они должны иметь правильный адрес.
Нет такой вещи как "нулевой параметр". Эти ссылки не могут быть "нулевыми".
(Важно не связывать это с идеей нулевого указателя, который имел обыкновение иметь нулевое значение по старым причинам - с макросом NULL
определяется как ноль для "удобства" - но в настоящее время nullptr
.)
Если вы хотите сделать эти значения необязательными, используйте boost::optional
, который формирует оболочку вокруг элемента данных и логическое значение, указывающее, заполнен ли элемент:
float doSomething(boost::optional<float>& foo)
{
if (foo) {
return someEquation(foo.get());
}
return somethingElse();
}
Теперь допустимые значения:
3.5f
42
0
-5
И не передавать значение вообще
boost::none
Если вы хотите сохранить ссылку на const
, вы бы сделали что-то вроде:
boost::optional<float> myValue = 3; // or 42, or 5.1, or boost::none
doSomething(myValue);
boost::optional
был почти std::optional
начиная с C++14, но в настоящее время является частью TS базовых библиотек, который, как мы надеемся, полностью превратит ее в C++ 17.