将功能委托/转发给成员(组合)

Delegate/forward function to member (composition)

本文关键字:成员 组合 转发 功能      更新时间:2023-10-16

假设我有这个类

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&);
    }
};

然后,编译器将生成相应的代码。但是我没有找到这样的东西,可能吗?

第一种方法:您可以公开继承std::vector<T>以使此类委派成为可能:

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

是否继承std::vector几乎没有争议,但这是你的代码。

第二种方式:如果你对构图很讲究,那么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()

第三种方式:语法糖的重载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()