У меня есть функция, которая решает одно из 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 цента здесь.
Вы также можете напрямую использовать указатели и отправлять 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.