3

クラスStagingConfigDatabaseに似たサードパーティライブラリのクラスがいくつかあります。これらのクラスは、作成後に破棄する必要があります。RAIIにshared_ptrを使用していますが、例に示すように、個別のテンプレートファンクターを使用するのではなく、 1行のコードを使用して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(); } );

しかし、それはコンパイルされません:(

ヘルプ!

4

2 に答える 2

4

あなたの最初のコードはそれなしではコンパイルされないので、私はそれcreateが静的であると仮定します。StagingConfigDatabase破壊に関しては、あなたは簡単なものを使うことができますstd::mem_fun

#include <memory>

boost::shared_ptr<StagingConfigDatabase> pSDB(StagingConfigDatabase::create(), std::mem_fun(&StagingConfigDatabase::destroy));
于 2010-12-20T16:45:06.550 に答える
3

どのコンパイラを使用していますか?ラムダのような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を出力する」という意味です。

于 2010-12-20T16:41:34.387 に答える