2

ハワード・ヒナントは、 カスタムストレージタイプも使用できると説明しました。彼は例として「共有メモリ」に言及しています。unique_ptr

彼は大まかなアイデアを与えるだけです(これは簡単なイントロには問題ありません)。しかし、誰でも「カスタムストレージタイプ」(共有メモリかどうかに関係なく)の例を完成させることができますか?

共有メモリへの配置をサポートするためunique_ptrに、カスタムデリータにカスタムポインタタイプを含めることができます(通常、共有メモリアプリケーションでは実際のポインタではありません)。ポインタの動作をエミュレートするポインタと呼ばれるネストされた型を削除機能内に配置するだけで、一般にアクセスできます

template <class T>
class MyDeleter
{
public:
    class pointer
    {
     public:
        friend bool operator==(pointer x, pointer y);
        friend bool operator!=(pointer x, pointer y);
        // ...
    };

    void operator()(pointer p);
};

void test()
{
    unique_ptr<int, MyDeleter<int> > p;
    MyDeleter<int>::pointer p2 = p.get();  // A custom pointer type used for storage
}

私はそれを// ...拡張する必要があるとtest()思います、そしておそらく実際の「カスタムストレージタイプ」の例でいくつかの追加のことをするでしょう。

誰かがどこにいるのか教えてもらえますか

  • 実際にはすでにこのカスタマイズを使用しています、
  • そしてその文脈では、
  • どのカスタマイズコード、(//...おそらく)
  • そして、クライアントコードはそれをどのように使用しますか?(test()おそらく)
4

2 に答える 2

2

のこのカスタマイズポイントの動機付けのユースケースとして機能したboost::offset_ptrに興味があるかもしれませんunique_ptroffset_ptrは完全に開発されたポインタ型であり、単純なtypedefを使用してカスタム削除機能にインストールできます。その使用例は、unique_ptr共有メモリに入れることです。

于 2011-06-07T21:16:23.633 に答える
2

20.7.1.2/3は私たちに教えてくれます

タイプunique_ptr<T、D> :: pointerは、NullablePointer(17.6.3.3)の要件を満たしている必要があります。

17.6.3.3によると、タイプが与えられたP場合、これらの要件は次のとおりです。

  • PEqualityComparableDefaultConstructibleCopyConstructibleCopyAssignable、およびDestructibleです。
  • の左辺値P交換可能です
  • タイプPのオブジェクトを値で初期化すると、そのタイプのnull値が生成され、null値はそれ自体とのみ同等になります。
  • タイプのオブジェクトは、コンテキストに応じて次のように変換できPます。bool
  • タイプのオブジェクトはPで初期化して割り当てることができnullptr、これによりnull値が生成されます
  • タイプのオブジェクトは、とP比較して同等である可能性がnullptrあり、オブジェクトにnull値がある場合にのみ、比較はtrueになります。
  • 必要な操作はどれもスローできません(ただし、明示的なnoexceptまたはは必要ありませんthrow()

operator*特に、とoperator->は実際には必要ないことに注意してください。nullptrまた、組み込みの数値型は、初期化/割り当てを除くすべての要件を満たしていることに注意してください。

たとえば、次のタイプはすべての要件を満たす必要があります。

class handle {
    int id;
  public:
    // default and nullptr constructors folded together
    handle(std::nullptr_t = nullptr) : id(0) { }

    explicit operator bool() { return l.id != 0; }

    friend bool operator ==(handle l, handle r) { return l.id == r.id; }
    friend bool operator !=(handle l, handle r) { return !(l == r); }

    // default copy ctor and operator= are fine

    // explicit nullptr assignment and comparison unneeded
    // because of implicit nullptr constructor

    // swappable requirement fulfilled by std::swap
}
于 2011-06-07T22:04:23.073 に答える