Ответ 1
Использование:
if (!blah)
{
//This checks if the object was reset() or never initialized
}
Я использую reset()
как значение по умолчанию для моего shared_pointer (эквивалентно NULL
).
Но как проверить, является ли shared_pointer NULL
?
Вернет ли это правильное значение?
boost::shared_ptr<Blah> blah;
blah.reset()
if (blah == NULL)
{
//Does this check if the object was reset() ?
}
Использование:
if (!blah)
{
//This checks if the object was reset() or never initialized
}
if blah == NULL
будет работать нормально. Некоторые люди предпочли бы его тестировать как bool (if !blah
), потому что он более явный. Другие предпочитают последнее, потому что оно короче.
Вы можете просто проверить указатель как логическое: он будет оценивать до true
, если он не равен null и false
, если он равен null:
if (!blah)
boost::shared_ptr
и std::tr1::shared_ptr
оба реализуют idoom safe-bool, а С++ 0x std::shared_ptr
реализует явный оператор преобразования bool
. Они позволяют использовать shared_ptr
как булев при определенных обстоятельствах, подобно тому, как обычные указатели могут использоваться как логические.
Как показано в boost::shared_ptr<>
синопсисе класса, существует оператор safe-bool:
operator unspecified-bool-type() const; // never throws
Итак, используйте shared_ptr<>
, как если бы это был bool
:
if (!blah)
{
// this has the semantics you want
}