std :: unordered_set <std :: unique_ptr>(C ++ 20)でポインタT *を見つけます

ミハイル

で指摘したようにはstd :: unique_ptrをするのstd :: unordered_setを使用して、それがポインタを見つけることは容易ではありませんT*でしstd::unordered_set<std::unique_ptr<T>>C ++ 20より前は、のインスタンスを作成する必要がありましたstd::unique_ptr<T>

順序付けされていないコンテナの提案(http://wg21.link/P0919r3およびhttp://wg21.link/p1690r1異種ルックアップのおかげで、この問題はC ++ 20で解決されます。しかし、利用可能なソリューションは私にはかなり不器用に見えます(C ++標準でも)。1つではなく2つのファンクターを最初から実装する必要があるようです(透過的なハッシュと透過的な比較のため):

template<class T>
struct Equal {
    using is_transparent = void;
    bool operator()(const std::unique_ptr<T>& lhs, const std::unique_ptr<T>& rhs) const {
        return lhs == rhs;
    }
    bool operator()(const std::unique_ptr<T>& lhs, const T* rhs) const {
        return lhs.get() == rhs;
    }
    bool operator()(const T* lhs, const std::unique_ptr<T>& rhs) const {
        return lhs == rhs.get();
    }
};

template<class T>
struct Hash {
    using is_transparent = void;
    size_t operator()(const std::unique_ptr<T>& ptr) const {
        return std::hash<const T*>()(ptr.get());
    }
    size_t operator()(const T* ptr) const {
        return std::hash<const T*>()(ptr);
    }
};

template<class T>
using UnorderedSetOfUniquePtrs = std::unordered_set<std::unique_ptr<T>, Hash<T>, Equal<T>>;

デモ:https//gcc.godbolt.org/z/bqx714(提案は現在MSVCでのみ実装されています)。

これは機能しますが、多くの定型文のように見えます。私は何かが足りないのですか?IDKを使用する方法はありますか?標準の透明なハッシャーまたは等価コンパレーターはありますか?私はそれが見std::equal_to<void>透明ですが、私はそれを直接使用することはできません。unique_ptr<T> -> T*「このUnorderedSetOfUniquePtrsクラスのためだけに」暗黙の変換を定義する卑劣な方法があるのではないでしょうか。あなたのアイデアは大歓迎です。

lubgr

冗長性をstd :: to_address(それを指摘してくれた@Calethに感謝)と、生のアドレスに基づいてハッシュを返すことにstd::hash特化した既存のstd::unique_ptr(ヒントをくれた@Mikhailに感謝)にシフトできます。次に、メンバー関数テンプレートを使用してハッシュ型と等価型を実装します(型自体をテンプレートにする必要がなくなったことに注意してください)。

struct Equal {
    using is_transparent = void;
    template<class U, class S>
    bool operator()(const U& lhs, const S& rhs) const { 
        return std::to_address(lhs) == std::to_address(rhs); 
    }
};

struct Hash {
    using is_transparent = void;
    template<class U>
    size_t operator()(const U& ptr) const {
        return std::hash<U>{}();
    }
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

std :: unique_ptr <std :: unique_ptr <T> []>を初期化する方法は?

分類Dev

C ++ 11:カスタムLambdaDeleterでstd :: unique_ptrを返す

分類Dev

C ++で静的std :: map <int、unique_ptr <int >>を初期化する

分類Dev

STLコンテナを使用したC ++ std :: unique_ptr

分類Dev

C ++-vector <>のstd :: unique_ptrはnullptrです

分類Dev

コピーせずにstd :: unique_ptrでstd :: moveを呼び出すC ++

分類Dev

std :: vector <std :: unique_ptr <T >>を別のstd :: vector <std :: unique_ptr <T >>に割り当てます

分類Dev

QVector <std :: unique_ptr <Type >>でstd :: findを使用します

分類Dev

std :: unique_ptrをstd :: setに挿入する

分類Dev

std :: mapのC ++ std :: unique_ptr

分類Dev

std :: setまたはstd :: unordered_setでの挿入順序の保持

分類Dev

C ++:イテレータがあるstd :: unordered_setの要素を置き換えます

分類Dev

std :: unique_ptr <T>の代わりにstd :: unique_ptr <T>&を使用する利点はありますか?

分類Dev

C ++ 11-変数を任意のstdコンテナ(vector、list、set、unordered_set)に配置する

分類Dev

std :: move(nullptr)を使用したunique_ptrのoperator =でのC ++エラー

分類Dev

std :: moveまたはstd :: forwardパラメーターstd :: unique_ptr <T> &&

分類Dev

std :: vector <std :: queue <std :: unique_ptr <int >>>のサイズを変更する方法は?

分類Dev

std :: unique_ptr <Dervied>からstd :: unique_ptr <Base>への変換のコストはいくらですか?

分類Dev

エラーC2248: 'std :: unique_ptr <_Ty> :: unique_ptr':クラスで宣言されたプライベートメンバーにアクセスできません 'std :: unique_ptr <_Ty>'

分類Dev

なぜstd :: unique_ptr :: makeではなくstd :: make_uniqueなのですか?

分類Dev

std :: unique_ptrを使用したC ++ PimplIdiom不完全型

分類Dev

std :: unique_ptrのポインタを破棄せずに変更する

分類Dev

std :: unique_ptrのコンテンツを指す

分類Dev

dllのstd :: unique_ptr pimplは、ビジュアルスタジオでC4251を生成します

分類Dev

std :: unique_ptr <Derived>をstd :: unique_ptr <Base>に変換しています

分類Dev

std :: copyでunique_ptrを使用する方法は?

分類Dev

構造体でstd :: unique_ptrを使用する方法は?

分類Dev

std :: vector <std :: unique_ptr <int >>はコンパイルされません

分類Dev

std :: unique_ptrとstd :: map

Related 関連記事

  1. 1

    std :: unique_ptr <std :: unique_ptr <T> []>を初期化する方法は?

  2. 2

    C ++ 11:カスタムLambdaDeleterでstd :: unique_ptrを返す

  3. 3

    C ++で静的std :: map <int、unique_ptr <int >>を初期化する

  4. 4

    STLコンテナを使用したC ++ std :: unique_ptr

  5. 5

    C ++-vector <>のstd :: unique_ptrはnullptrです

  6. 6

    コピーせずにstd :: unique_ptrでstd :: moveを呼び出すC ++

  7. 7

    std :: vector <std :: unique_ptr <T >>を別のstd :: vector <std :: unique_ptr <T >>に割り当てます

  8. 8

    QVector <std :: unique_ptr <Type >>でstd :: findを使用します

  9. 9

    std :: unique_ptrをstd :: setに挿入する

  10. 10

    std :: mapのC ++ std :: unique_ptr

  11. 11

    std :: setまたはstd :: unordered_setでの挿入順序の保持

  12. 12

    C ++:イテレータがあるstd :: unordered_setの要素を置き換えます

  13. 13

    std :: unique_ptr <T>の代わりにstd :: unique_ptr <T>&を使用する利点はありますか?

  14. 14

    C ++ 11-変数を任意のstdコンテナ(vector、list、set、unordered_set)に配置する

  15. 15

    std :: move(nullptr)を使用したunique_ptrのoperator =でのC ++エラー

  16. 16

    std :: moveまたはstd :: forwardパラメーターstd :: unique_ptr <T> &&

  17. 17

    std :: vector <std :: queue <std :: unique_ptr <int >>>のサイズを変更する方法は?

  18. 18

    std :: unique_ptr <Dervied>からstd :: unique_ptr <Base>への変換のコストはいくらですか?

  19. 19

    エラーC2248: 'std :: unique_ptr <_Ty> :: unique_ptr':クラスで宣言されたプライベートメンバーにアクセスできません 'std :: unique_ptr <_Ty>'

  20. 20

    なぜstd :: unique_ptr :: makeではなくstd :: make_uniqueなのですか?

  21. 21

    std :: unique_ptrを使用したC ++ PimplIdiom不完全型

  22. 22

    std :: unique_ptrのポインタを破棄せずに変更する

  23. 23

    std :: unique_ptrのコンテンツを指す

  24. 24

    dllのstd :: unique_ptr pimplは、ビジュアルスタジオでC4251を生成します

  25. 25

    std :: unique_ptr <Derived>をstd :: unique_ptr <Base>に変換しています

  26. 26

    std :: copyでunique_ptrを使用する方法は?

  27. 27

    構造体でstd :: unique_ptrを使用する方法は?

  28. 28

    std :: vector <std :: unique_ptr <int >>はコンパイルされません

  29. 29

    std :: unique_ptrとstd :: map

ホットタグ

アーカイブ