1

C++03 では、一連の C 関数をクラスにラップして「自動オブジェクト」を作成する場合、カプセル化された関数のタイプに合わせてオブジェクトをカスタマイズする必要がありました。たとえば、Windows ファイル HANDLE をラップするには、デストラクタでCloseHandle()を呼び出し、コンストラクタでCreateFile()を呼び出す必要がありました。コンストラクターは、CreateFile() 関数の関数シグネチャを模倣する必要があり、ファイル HANDLE 変数は使用されません (管理されているため)。

とにかく、私が知りたいのは、C++ 11 の新機能を使用して、作成と削除の実装を提供するだけで、あらゆるタイプのリソースをラップするために使用できる単一のジェネリック クラスを作成できるかどうかです。

私が予見する問題の 1 つは、上記の CreateFile() などの作成関数が任意の数のパラメーターを取得できることです。関数の署名を模倣するテンプレート化されたコンストラクターを自動的に生成する方法はありますか? Variadic パラメータが頭に浮かびますが、まだ使用していません。

誰かがこのようなものを書いてみましたか?

編集:説明に役立ついくつかのコード(疑似):

template<typename Res, FunctionPtrToCreatorFunc Func, typename... Arguments>
class creator
{
public:
  operator()(Res &r, Arguments... Args)
  {
    Func(r, /*use args?*/ Args); // Allocate resource, ie. CreateFile(r, args)
  }
};

template<typename Res, FunctionPtrToDeleterFunc Func>
class deleter
{
  operator()(Res &r)
  {
    Func(r); // delete the resource, ie. CloseHandle(r)
  }
};

次に、これが私のスーパー自動オブジェクトの実装になります。

template<typename Res, typename Creator, typename Deleter>
class auto_obj
{
public:

  auto_obj(/*somehow copy Args from Creator class?*/)
  {
    Creator(_res, /*args?*/);
  }

  ~auto_obj()
  {
    deleter(_res);
  }

  Res _res;
};

はい、これはshared_ptrorと同様の構造を持っていunique_ptrますが、代わりにコンストラクターは、開発者が作成した作成者クラスと削除者クラスによってリソースを作成するものになります。std::bind がこれに関与している可能性があると感じていますが、使用したことはありません。

4

1 に答える 1