Как передать средство удаления в метод того же класса, который содержится в shared_ptr - PullRequest
3 голосов
/ 20 декабря 2010

У меня есть несколько классов из сторонней библиотеки, аналогичной классу StagingConfigDatabase, который необходимо уничтожить после его создания.Я использую shared_ptr для RAII, но предпочел бы создать shared_ptr, используя одну строку кода вместо использования отдельного функтора шаблона, как показывает мой пример.Возможно, используя лямбды?или связать?

struct StagingConfigDatabase
{
  static StagingConfigDatabase* create();
  void destroy();
};

template<class T>
    struct RfaDestroyer
    {
        void operator()(T* t)
        {
            if(t) t->destroy();
        }
    };

    int main()
    {
      shared_ptr<StagingConfigDatabase> pSDB(StagingConfigDatabase::create(), RfaDestroyer<StagingConfigDatabase>());
    return 1;
    }

Я рассматривал что-то вроде:

shared_ptr<StagingConfigDatabase> pSDB(StagingConfigDatabase::create(), [](StagingConfigDatabase* sdb) { sdb->destroy(); } );

, но это не компилируется: (

Help!

Ответы [ 2 ]

4 голосов
/ 20 декабря 2010

Я предполагаю, что create является статическим в StagingConfigDatabase, потому что ваш исходный код не скомпилируется без него.Что касается уничтожения, вы можете использовать простой std::mem_fun:

#include <memory>

boost::shared_ptr<StagingConfigDatabase> pSDB(StagingConfigDatabase::create(), std::mem_fun(&StagingConfigDatabase::destroy));
3 голосов
/ 20 декабря 2010

Какой компилятор вы используете? Поддерживает ли он функции C ++ 0x, такие как лямбды? Следующее (которое в основном совпадает с вашим примером) компилируется и отлично работает для меня под MSVC 2010:

#include <iostream>
#include <memory>

struct X
{
    static X *create()
    {
        std::cout << "X::create\n";
        return new X;
    }

    void destroy()
    {
        std::cout << "X::destroy\n";
        delete this;
    }
};

int main()
{
    auto p = std::shared_ptr<X>(X::create(), [](X *p) { p->destroy(); });
    return 0;
}

Под «работает нормально» я имею в виду «вывод X :: create, за которым следует X :: destroy».

...