Функция шаблона, чтобы проверить, является ли умный указатель нулевым - PullRequest
0 голосов
/ 27 апреля 2018

Чтобы сформулировать вопрос, у меня был макрос, который взял параметр и вызвал методы для него, используя ->.

Я хотел расширить его, чтобы проверить на ноль, но обнаружил, что люди уже используют его с умными указателями, некоторые из которых не поддерживают преобразование в bool.

У некоторых из этих умных указателей есть методы с разными именами для проверки на ноль, и у меня нет доступа ко всему коду, который использует это, поэтому мне нужно общее решение.

Я думал о том, чтобы макрокоманду перешло к какой-то шаблонной функции, но я не уверен, как это сделать вообще.

1 Ответ

0 голосов
/ 27 апреля 2018

Если он используется с ->, и он работает через operator->, который возвращает внутренний указатель, то, возможно, вы могли бы сравнить его с NULL:

if(ptr.operator->() == NULL) throw std::invalid_argument("The pointer points to nowhere");

Хорошо, поэтому, если «умные указатели» возвращают «умные указатели», нам нужно пойти глубже:

template<typename T> bool isNull(T *t) { return t == NULL; }
template<class T> bool isNull(T const &t) { return isNull(t.operator->()); }

Страшно и эффективно (но нуждается в const -качественной перегрузке operator->.

...