10

不完全な型で動作する非共有ポインターである標準ポインター クラス (またはブースト) はありますか? 私は C++11 標準と boost ライブラリを調べましたが、非常に便利なタイプのように見えますが、見つけることができません。

たとえば、スマート ポインターを使用して不透明な型を作成できるようにしたいと考えています。

  class A;
  wrap_ptr<A> some_func();
  void other_func( A const & );

A様々な用途に使用できる不透明タイプです。上記のインターフェースのユーザーは A の不完全な定義しか持っていませんが、ポインターを削除/リセットできるはずです。上記は a で実行できることはわかっていますがshared_ptr、この特定のコードでは望ましくないオーバーヘッドがあります。unique_ptr正しい所有権のセマンティクスがありますが、不完全な型では機能しません。理論的には、ラッパーはデリータへのポインタを持つオーバーヘッドのみを必要とするはずです。

C++11 またはブースト ライブラリにそのような型はありますか?

注: このタイプを簡単に作成できることは理解していますが、可能であれば標準タイプを希望します。基本的なスマート ポインター型である必要があるようです。


更新:unique_ptr良いオプションではないようです。まず、構文のオーバーヘッドが相殺されます。第二に、カスタム デリーターで安全に使用できるとは確信していません。どのように機能するかを確認します。

4

3 に答える 3

9

unique_ptr について明確にするために:不完全な型で動作しますが、そのようなクラスのヘッダーで使用する場合:

#include <memory>

class A;

class B
{

std::unique_ptr<A> m_a;

};

デリーターの実装が欠落しているため、リンクしません。これには簡単な修正方法があります。ホスト クラスのデストラクタが空であっても、デフォルトであっても、cpp で定義するだけです。

// B.hpp
#include <memory>

class A;

class B
{
public:

    B();
    ~B();

private:

std::unique_ptr<A> m_a;

};

// B.cpp

B::B(){} // or =default; (if you have a compiler providing it)
B::~B(){} // or =default; (if you have a compiler providing it)

また、私の質問への回答を読んでください: Is std::unique_ptr<T> required to know the full definition of T?

また、Herb Sutter によってどのように pimpl イディオム (unique_ptr の不完全な型を意味する) の実装が推奨されているかを見てみましょう: http://herbsutter.com/gotw/_100/

于 2012-01-30T13:14:47.097 に答える
5

実際にunique_ptrは、カスタムのデリータを指定する限り、不完全な型でも動作します。

ただし、 とは逆にshared_ptr、カスタム デリータは静的に (2 番目のテンプレート パラメータとして) 正確に指定されるため、これは実際にはそのタイプに影響します。

于 2012-01-30T09:33:27.470 に答える
2

std::unique_ptrはこのケースを処理できますが、デフォルトの削除では処理できません。不完全な型を処理できるデリータを作成してから、 を使用する必要がありますstd::unique_ptr<A,MyDeleter>

于 2012-01-30T09:34:56.530 に答える