委托/转发职能(成员)

时间:2012-12-04 09:08:52

标签: c++ delegates wrapper forwarding

假设我有班级

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

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

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

有没有办法在编译时将函数(或运算符)委托给_vector,而没有开销

我当然可以(而且这就是我正在做的事情)通过声明我需要的每一个函数来转发所有内容,然后像调用size()一样调用适当的函数给成员。

This article 正好提出我需要的东西。例如使用这个:

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

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

1 个答案:

答案 0 :(得分:2)

第一种方式:您可以公开继承std::vector<T>以使此类授权成为可能:

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

是否继承std::vector很少debatable,但那是你的代码。

<击> 第二种方式:如果你特别关注合成,那么让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()