0

オブジェクトの (共有) 所有権を 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> );
};
4

1 に答える 1