Как насчет этого:
if (object.Equals(myArgument, default(T)))
{
//...
}
Используя static object.Equals()
метод избегает потребности в Вас сделать эти null
проверка самих. Явно квалификация вызова с object.
, вероятно, не необходима в зависимости от Вашего контекста, но меня обычно префикс static
вызовы с именем типа только для создания кода более разрешимым.
В сообщении об ошибке сказано все: вы передаете целое число вместо ссылки на указатель на SomeType. Чтобы делать то, что вы хотите, вы можете использовать указатель на указатель на SomeType:
void myFunc(SomeType** var=NULL);
void MyClass::myFunc(SomeType** var){
if(var!=NULL && *var!=NULL)
(**var)=(*someOtherPointer);
if(var!=NULL && someCondition)
*var=NULL;
}
NULL
не является l-значением - его нельзя передать по ссылке. Это было бы похоже на передачу 4
функции, которая ожидает int &
.
Часть 'int' обусловлена тем, что NULL
определен макросом ] 0
.
Лучше всего использовать указатель для передачи указателя по ссылке, то есть двойной указатель. Затем, если параметр равен NULL
, ничего не было передано. В противном случае следует изменить адрес указателя [чтобы он указывал на NULL, если выполняется какое-то условие].
Вы также можете рассмотреть возможность использования boost :: optional (не самый простой код, который вы можете использовать, но вариант есть):
void f( boost::optional<int&> r = boost::optional<int&>() )
{
if ( r ) *r = 5;
}
int main()
{
int x = 0;
f( x ); std::cout << x << std::endl; // 5, it did change the value
f(); // compiler will default to an empty optional<int&> object
}
Хорошо, я понимаю, почему вы сделали это с точки зрения тренировки мозга C ++, но действительно ли вы делаете это в производственном коде? Это выглядит как невероятно туманная техника с побочными эффектами, если посмотреть на код как коллега год спустя. Думали ли вы об использовании двух отдельных функций с понятными именами, одна из которых возвращает указатель, а другая выполняет любую другую необходимую работу?