これは私のコードで一般的なパターンになりつつあります.A.「重い」またはB.クリティカルセクションなどのオペレーティングシステムリソースであるために、コピー不可にする必要があるオブジェクトを管理する必要がある場合:
class Resource;
class Implementation : public boost::noncopyable
{
friend class Resource;
HANDLE someData;
Implementation(HANDLE input) : someData(input) {};
void SomeMethodThatActsOnHandle() {
//Do stuff
};
public:
~Implementation() { FreeHandle(someData) };
};
class Resource
{
boost::shared_ptr<Implementation> impl;
public:
Resource(int argA) explicit {
HANDLE handle =
SomeLegacyCApiThatMakesSomething(argA);
if (handle == INVALID_HANDLE_VALUE)
throw SomeTypeOfException();
impl.reset(new Implementation(handle));
};
void SomeMethodThatActsOnTheResource() {
impl->SomeMethodThatActsOnTheHandle();
};
};
このようにして、shared_ptr は参照カウントの頭痛のResource
種を処理し、コピー可能にすることができます。
Implementation
しかし、 boost の侵入コンテナのように、何らかの方法でそのデータを内部に移動できれば、shared_ptr の参照カウントなどを個別に割り当てるオーバーヘッドを節約できそうです。
これにより、時期尚早の最適化ハックルが一部の人々を悩ませている場合、現在のプロジェクトにはこれが必要ないことに実際に同意します。しかし、それが可能かどうか興味があります。