std :: functionオブジェクトを使用してカスタム削除機能をstd :: unique_ptrに渡す

マティアス価格

std::unique_ptrカスタムデリッターでを初期化するための次の作業コードがあります

class Dataset
{
    ...
private:
    class CustomGDALDatasetDeleter {
    public:
            void operator()(GDALDatasetH res) const {
                ::GDALClose(res);
            }
    };
    using ResourceType = std::unique_ptr<GDALDataset,
                                         CustomGDALDatasetDeleter>;
    ResourceType data;
};

後で私はこのコードを持っています:

data = ResourceType(static_cast<GDALDataset*>(::GDALOpen(filename.c_str(),
                                              static_cast<GDALAccess>(mode)))
);

私は同じことをしようとするとstd::function、オブジェクトとlambdas私が得るbad_function_call例外を:

class Dataset
{
    ...
private:
    std::function<void (GDALDatasetH)> del = [](GDALDatasetH res){::GDALClose(res);};
    using ResourceType = std::unique_ptr<GDALDataset,
                                         decltype(del)>;
    ResourceType data;

};

私はここで何が間違っているのですか?

デデュプリケーター

ポリモーフィック関数ラッパーを使用しており、デフォルトの構築では空で構築されます
したがって、呼び出し時に例外がスローされます。

function() noexcept;

template <class A> function(allocator_arg_t, const A& a) noexcept;  

2事後条件:!*this

20.9.11.2.4関数の呼び出し[func.wrap.func.inv]

R operator()(ArgTypes... args) const

1効果:INVOKE (f, std::forward<ArgTypes>(args)..., R)(20.9.2)、ここfで、はのターゲットオブジェクト(20.9.1)です*this
2戻り値:がの場合R何もありませんvoidそれ以外の場合はの戻り値ですINVOKE (f, std::forward<ArgTypes>(args)..., R)
3スロー:bad_function_callif !*this; それ以外の場合は、ラップされた呼び出し可能オブジェクトによってスローされた例外。

最初に何かを入れる前/に削除ツールを設定すればdata、すべて問題ありません

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

std :: unique_ptrをクラスに渡す際のエラー

分類Dev

unique_ptrを使用して可変ラムダをconst&std :: functionに渡す

分類Dev

カスタム削除機能を使用してstd :: unique_ptrを簡潔に宣言できますか?

分類Dev

typedefを使用してstd :: unique_ptrのカスタムデフォルト削除機能を指定する

分類Dev

std :: unique_ptrをサブクラス化して、カスタム削除機能を透過的に適用しても大丈夫ですか?

分類Dev

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

分類Dev

std :: unique_ptrをコンストラクターに渡して、所有権を取得します

分類Dev

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

分類Dev

std :: unique_ptrは、引数がほとんどないカスタム削除機能を使用します

分類Dev

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

分類Dev

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

分類Dev

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

分類Dev

std :: unique_ptrを使用してオブジェクトの配列を作成します

分類Dev

std :: unique_ptrを関数に渡すにはどうすればよいですか

分類Dev

unique_ptrがベクター内にある場合、std :: unique_ptr <>が所有するオブジェクトへの参照/ ptrは安全ですか?

分類Dev

std :: unique_ptrとstd :: map

分類Dev

スレッド化の引数としてカスタムオブジェクトを使用してstd :: functionを渡すc ++

分類Dev

std :: moveを使用したカスタム削除機能を使用してstd :: unique_ptrを挿入できません

分類Dev

C ++ 11でカスタム削除機能を含むstd :: unique_ptrを返す方法は?

分類Dev

std :: shared_ptrからstd :: unique_ptrに変換する方法は?

分類Dev

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

分類Dev

std :: unique_ptrカスタムデリータとして使用するために、noexcept-detectable、callableオブジェクトで関数をラップするクラステンプレートを作成するにはどうすればよいですか?

分類Dev

派生クラスでカスタム削除機能を使用してstd :: make_uniqueを使用しますか?

分類Dev

c ++ std :: unique_ptr <>またはstd :: shared_ptr <>を使用したObjective-Cオブジェクトの管理

分類Dev

std :: unique_ptrのカスタム削除機能は、デストラクタを手動で呼び出すための有効な場所ですか?

分類Dev

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

分類Dev

std :: list <std :: unique_ptr <classname >>に新しいオブジェクトを追加する方法を理解できません

分類Dev

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

分類Dev

std :: unique_ptrをポリモーフィッククラスのオブジェクトに返す正しい方法

Related 関連記事

  1. 1

    std :: unique_ptrをクラスに渡す際のエラー

  2. 2

    unique_ptrを使用して可変ラムダをconst&std :: functionに渡す

  3. 3

    カスタム削除機能を使用してstd :: unique_ptrを簡潔に宣言できますか?

  4. 4

    typedefを使用してstd :: unique_ptrのカスタムデフォルト削除機能を指定する

  5. 5

    std :: unique_ptrをサブクラス化して、カスタム削除機能を透過的に適用しても大丈夫ですか?

  6. 6

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

  7. 7

    std :: unique_ptrをコンストラクターに渡して、所有権を取得します

  8. 8

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

  9. 9

    std :: unique_ptrは、引数がほとんどないカスタム削除機能を使用します

  10. 10

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

  11. 11

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

  12. 12

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

  13. 13

    std :: unique_ptrを使用してオブジェクトの配列を作成します

  14. 14

    std :: unique_ptrを関数に渡すにはどうすればよいですか

  15. 15

    unique_ptrがベクター内にある場合、std :: unique_ptr <>が所有するオブジェクトへの参照/ ptrは安全ですか?

  16. 16

    std :: unique_ptrとstd :: map

  17. 17

    スレッド化の引数としてカスタムオブジェクトを使用してstd :: functionを渡すc ++

  18. 18

    std :: moveを使用したカスタム削除機能を使用してstd :: unique_ptrを挿入できません

  19. 19

    C ++ 11でカスタム削除機能を含むstd :: unique_ptrを返す方法は?

  20. 20

    std :: shared_ptrからstd :: unique_ptrに変換する方法は?

  21. 21

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

  22. 22

    std :: unique_ptrカスタムデリータとして使用するために、noexcept-detectable、callableオブジェクトで関数をラップするクラステンプレートを作成するにはどうすればよいですか?

  23. 23

    派生クラスでカスタム削除機能を使用してstd :: make_uniqueを使用しますか?

  24. 24

    c ++ std :: unique_ptr <>またはstd :: shared_ptr <>を使用したObjective-Cオブジェクトの管理

  25. 25

    std :: unique_ptrのカスタム削除機能は、デストラクタを手動で呼び出すための有効な場所ですか?

  26. 26

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

  27. 27

    std :: list <std :: unique_ptr <classname >>に新しいオブジェクトを追加する方法を理解できません

  28. 28

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

  29. 29

    std :: unique_ptrをポリモーフィッククラスのオブジェクトに返す正しい方法

ホットタグ

アーカイブ