C ++テンプレートとジェネリックプログラミング5-テンプレートの柔軟性

16.6効率と柔軟性

この記事では、c ++プライマーはスマートポインターの2つの例を使用します

shared_ptrとunique_ptrが削除子を指定する方法の違いは、実際にはこれら2つのクラスの関数の違いです。

まず、shared_ptrの削除機能を定義する方法を見てみましょう。

csdnのウェブサイトから学ぶ

https://blog.csdn.net/hp_cpp/article/details/103452196

関数のポインターをコンストラクターに渡します。

#include <iostream>
#include <zconf.h>
#include "template.h"

using namespace std;

class Simple{

};

void deleter(Simple *)
{
    cout<<"Deleter function called"<<endl;
}
// 构造函数传递自定义删除器指针
int main() {
    std::shared_ptr<Simple> p1(new Simple[5],deleter);
    return 0;
}

コンストラクターでファンクターを使用する

このような例を見ることができます

class Deleter
{
public:
    void operator() (Simple *x) {
        std::cout << "Deleter function called" << std::endl;
        delete[] x;
    }
};
// 构造函数传递自定义删除器指针
int main() {
    Deleter del;
    std::shared_ptr<Simple> p1(new Simple[5],del);
    return 0;
}

演算子のオーバーロードを通じて、クラスを関数のような呼び出しメソッドにオーバーロードできます

Deleter del;
Simple* data = new Simple();
del(data);

これにより、と呼ばれるDeleter関数もトリガーされます

ラムダ式?

私はこの内容を本当に理解していません、ラムダが何であるかわかりません

std::shared_ptr<Sample> p3(new Sample[5], [](Sample *x) {
    std::cout << "Deleter function called" << std::endl;
    delete[] x;
});

このことをC ++で初めて聞いたとき

このラムダ式を見てみましょう:

ラムダ式はクロージャであることがわかりました。これは、PHPで無名関数と呼ばれるものです。基本的に1回だけ使用されるため、関数名は必要ありません。jsにもクロージャがあります。

最も単純なラムダ式の1つ

[] {} ();
void f()
{

}
int main()
{
    f();
}


これを理解すれば、上記の機能は非常に理解しやすいです

#include <memory>
#include <cstring>
#include <vector>
#include <stdio.h>
#include <iostream>
#include <zconf.h>
#include "template.h"

using namespace std;

class Simple{

};


// 构造函数传递自定义删除器指针
int main() {
    std::shared_ptr<Simple> p1(new Simple[5],[](Simple* x){
        std::cout << "Deleter function called" << std::endl;
        delete[] x;
    });
    return 0;
}

4番目の方法はdefault_deleteを使用することです

std::shared_ptr<Simple> p (new Simple[5],std::default_delete<Simple[]>());

unique_ptrがどのように削除者を指定するかを見てみましょう

unique_ptrは繰り返されず、テンプレートで関数を定義し、パラメーターが渡されたときに実装を行います。

詳しくはcsdnをご覧ください。

https://blog.csdn.net/hp_cpp/article/details/103210135

総括する

最後に、shared_ptrは、削除者のタイプが実行されるまで保存されないため、deleterをメンバーとして直接保存しないことがわかります。実際、削除者のタイプはいつでも変更できます。 unique_ptr deleterはコンパイル時です。ご存知のように、unique_ptrは、deleterを間接的に呼び出すオーバーヘッドを回避します。shared_ptrは、実行時にデリータをバインドすることにより、ユーザーがデリータをリロードするのをより便利にします。

おすすめ

転載: blog.csdn.net/qq_32783703/article/details/104981858