3

クラスがあるとします

template<class T>
class Vector
{
  public:
    Vector() = default;

    inline size_t size() const { return _vector.size(); }

  private :
    std::vector<T> _vector;
};

関数 (または演算子) をコンパイル時にオーバーヘッドなしで委任する方法はあり_vectorます?

もちろん、必要なすべての関数を宣言することですべてを転送し、適切な関数をメンバーに呼び出すことができsize()ます.

この記事では、私が必要とするものを正確に提案します。たとえば、これを使用します:

template<class T>
class Vector
{
  public:
    Vector() = default;

  private :
    std::vector<T> _vector;

  public:
    using _vector {
      size_t size() const;
      void push_back(const T&);
    }
};

その後、コンパイラは適切なコードを生成します。しかし、私はこのようなものを見つけられませんでした。

4

1 に答える 1

2

最初の方法: パブリックに継承std::vector<T>して、そのような委任を可能にすることができます:

template<class T>
class Vector : public std::vector<T>
...

継承するかどうかstd::vectorはほとんど議論の余地がありませんが、それはあなたのコードです。

2 番目の方法: 構成にこだわる場合は、Vector<T>オブジェクトをスマート ポインターとして動作させます。

template<typename T>
class Vector
{
  std::vector<T> _vector;    
public:
  std::vector<T>* operator -> () { return &_vector; }
};
Vector<int> vi;
vi->size(); // instead of vi.size()

3 番目の方法operator ():シンタックス シュガーのオーバーロード:

template<typename T>
class Vector
{
  std::vector<T> _vector;
public:
  std::vector<T>& operator ()() { return _vector; }
  const std::vector<T>& operator ()() const { return _vector; }
};
Vector<int> vi;
vi().size(); // instead of vi.size()
于 2012-12-04T09:15:39.947 に答える