увеличить Shared_pointer NULL - PullRequest
27 голосов
/ 10 апреля 2011

Я использую 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() ?
}

Ответы [ 4 ]

34 голосов
/ 10 апреля 2011

Использование:

if (!blah)
{
    //This checks if the object was reset() or never initialized
}
11 голосов
/ 10 апреля 2011

if blah == NULL будет работать нормально.Некоторые люди предпочли бы это вместо тестирования как bool (if !blah), потому что это более явно.Другие предпочитают последнее, потому что оно короче.

9 голосов
/ 10 апреля 2011

Вы можете просто проверить указатель как логическое значение: он оценивается как true, если он не равен нулю, и false, если он равен нулю:

if (!blah)

boost::shared_ptr и * 1007.* оба реализуют идиому safe-bool, а C ++ 0x std::shared_ptr реализует явный bool оператор преобразования.Они позволяют shared_ptr использоваться в качестве логического значения в определенных обстоятельствах, подобно тому, как обычные указатели могут использоваться в качестве логического значения.

7 голосов
/ 10 апреля 2011

Как показано в boost::shared_ptr<> документации , существует логический оператор преобразования:

explicit operator bool() const noexcept;
// or pre-C++11:
operator unspecified-bool-type() const; // never throws

Так что просто используйте shared_ptr<>, как если бы это было bool:

if (!blah) {
    // this has the semantics you want
}
...