これを機能させる方法はありますか?
#include <functional>
#include <memory>
int main()
{
std::function<unsigned char*(size_t)> allocator
= [](size_t size){
return new unsigned char[size];
};
std::function<void(unsigned char*)> deleter
= [](unsigned char* ptr){
delete[] ptr;
};
std::shared_ptr<unsigned char[]> mem(size_t,deleter,allocator);
return EXIT_SUCCESS;
}
エラーが発生します:
main.cpp: In function ‘int main()’:
main.cpp:15:49: error: ‘deleter’ is not a type
std::shared_ptr<unsigned char[]> mem(size_t,deleter,allocator);
^~~~~~~
main.cpp:15:57: error: ‘allocator’ is not a type
std::shared_ptr<unsigned char[]> mem(size_t,deleter,allocator);
^~~~~~~~~
もう少しコンテキスト:
いくつかのメモリを保持するテンプレートクラスがあります。これは、カスタムアロケーターとデリッターで作成されたshared_ptrを使用して行われます。AllocatorとDeleterは、クラスのテンプレートパラメータではありません。
ここで、サイズ変更メソッドをクラスに追加したいと思います。新しいアロケーターとデルターを提供する必要を避け、それらをに保存したいと思いstd::function
ます。
アロケータはデータ割り当てを処理することは想定されておらず、shared_ptr
の内部データの割り当てを処理する必要があります。
コンストラクターへの最初の引数として、すでに割り当てられているデータを提供する必要があります。shared_ptr
メモリのクリーンアップのみを処理します。
さらに、shared_ptrのテンプレート引数は、間接参照のない型である必要があります。
#include <functional>
#include <memory>
int main()
{
std::function<void(unsigned char*)> deleter
= [](unsigned char* ptr){
delete[] ptr;
};
std::shared_ptr<unsigned char> mem(new unsigned char[5], deleter);
return EXIT_SUCCESS;
}
ラムダを優先する必要がある場合はstd::function
、コンパイラに最適化の可能性を残します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加