Предположим, у меня есть объект, который может быть неправильно инициализирован, но это не просто нулевой указатель на объект; это объект с пустыми или неинициализированными членами. Но я хочу, чтобы проверить его в качестве читаемым образом, как если бы это был указатель:Проверка действительности объекта C++, как если бы он был указателем
if (Object) use(Object);
Например, объект может иметь int
поле, которое, если 0, считается неинициализированным. Тогда я могу сделать перегруз! оператор так:
bool operator!() const {return intField == 0;}
я могу использовать его так:
if (! Object) initialize (Object);
Дело в том, если я хочу, чтобы проверить на противоположное состояние (не нуль-Ness), я не могу сделать именно это:
if (Object)...
Я только найти неловкое возможности:
if (! (! Object))... // awful
if (Object.notNull()) // not so bad
ближе всего к моим желаниям сбивают с толку:
bool operator()() {return intField != 0;}
if (Object())... // it looks a lot like an argument-less constructor
AFAIK, нет BOOL возвращающих пустого оператора (что-то вроде bool operator() {...}
) или любой другой трюк или идиомы, которые могут достичь этого.
Любые идеи читаемого решения, кроме метода notNull()
? Благодарю.
Я согласен, потому что код должен быть как можно более ясным. Но, с другой стороны, операторы перегрузки много о концептуальном рассмотрении объектов, и если вы привыкли писать (или, по крайней мере, читать) 'if (pointer)', чтобы проверить, что 'pointer' не является нулевым, вы можете найти что 'if (object)' концептуально понятен. Это вопрос нахождения хорошего баланса между ясностью, многословием и концептуальной адекватностью. – JMB