データを取得して処理する関数を記述する必要があります。このデータは、いくつかの方法(データ・セグメントに、ヒープ上、共有メモリ・セグメント上など)に割り当てられることがあります。data
を動的に割り当てることができるので、C++:unknow deleterを持つunique_ptr
T *data;
if(global) data = &d;
if(heap) data = new T [ size ];
if(shm) data = (T*) shmat(id, 0, 0);
// processing data ...
私は最善の方法だと思うだろうそれを処理するには、unique_ptr
または他の種類のスマートポインタを使用しています。しかし、常に動的に割り当てられているわけではありません。実行時にdeleterをunique_ptr
に選択する必要がありますが、それは不可能です。
data
を定義して処理する方法を教えてください。
enum DataPointerType
{
Stack,
Dynamic,
SharedMem,
...
};
template <class T>
class DataPointer
{
public:
DataPointer(T* pointer, DataPointerType type)
: _ptr(pointer), _type(type)
{ }
~DataPointer()
{
switch (type) {
case Stack: break;
case Dynamic: delete _ptr; _ptr = nullptr; break;
...
}
}
T& operator*() { return *_ptr; }
const T& operator*() const { return *ptr; }
T* operator->() { return _ptr; }
const T* operator->() const { return ptr; }
private:
T* _ptr;
DataPointerType _type;
// Prevent copying and destruction, dangerous
DataPointer(const DataPointer& other);
DataPointer& operator=(const DataPointer& other);
};
興味深い関連の読み取り:[より良いアロケータに向けてモデル](http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cts=1330701318745&ved=0CCYQFjAA&url=http%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22 %2Fwg21%2Fdocs%2Fpapers%2F2005%2Fn1850.pdf&gt; A-RQT-DXBeXA0QGJqqXFDQ&usg = AFQjCNFS07GH0af749GIyOIjE-QCc-K7dw&sig2 = hBWQcfg-EUOmH2d8UI5UuQ)。これは、型の一部であるDeleterの型が、単一の関数で異なるDeleter型を持つ 'unique_ptr'の使用を中断する特殊なケースです...私の推奨事項:deleterで型削除を実行する際に' shared_ptr'を使用してください。 .. –