オブジェクトの (共有) 所有権を function に渡したいと思いますfoo::bar
。問題は、所有権が排他的であろうと共有であろうと、私は気にしないということです。所有権の詳細class foo
を気にしたくないインターフェイスと見なします。私が気にかけているのは、渡されたスマート ポインターの有効期間を が返された後も確保できることだけですfoo::bar
。
今、私は書くことができました
class foo {
void bar( std::shared_ptr<blub> );
void bar( std::unique_ptr<blub> );
};
しかし、これは、いくつかのスマート ポインターの亜種が蓄積されている時代にはエレガントではありません。また、すべてのバリアントに対してオーバーロードを記述するのは非常に面倒です。特に、コードでこのスキームを複数回使用したい場合はなおさらです。
foo
明らかなテンプレートの複雑さのために、私もテンプレート化されたくありません。
私が思いつくことができる最も簡単なのは、スマートポインターラッパーです
template <typename T>
class owning_ptr {
// Sorts out the largest type so we can allocate enough space
typedef largest<std::shared_ptr<T>, std::unique_ptr<T>, myptr<T>>::type big_type;
typedef std::aligned_storage <sizeof(big_type), std::alignment_of<big_type>::value>::type buffer_type;
buffer_type _internal;
int _type;
};
これは少し非効率的です。ラッパーを構築するより良い方法はありますか?
最後に、私は本当に署名をしたいと思います:
class foo {
void bar( owning_ptr<blub> );
};