【问题标题】:Delegate/forward function to member (composition)将功能委托/转发给成员(组合)
【发布时间】:2012-12-04 09:08:52
【问题描述】:

假设我有课

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 propose 正是我需要的。例如使用这个:

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

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

【问题讨论】:

  • 我想我会因为提到它而受苦,但是私有继承和使用是可能的......
  • 您的内联函数可能在编译时转发而没有任何开销。建议的转发简写未纳入标准,因此您必须手动完成。
  • @BoPersson 是的,我只是想要一种懒惰的方式来不写它:)

标签: c++ delegates wrapper forwarding


【解决方案1】:

第一种方式:您可以公开继承std::vector&lt;T&gt; 以使此类委托成为可能:

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

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

第二种方式:如果你对组合很讲究,那么让Vector&lt;T&gt;对象表现得像智能指针:

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()

【讨论】:

  • 我想避免继承。我喜欢其他解决方案。用第二个调用 operator[] 的语法是什么?这些解决方案有什么缺点吗?
  • @ThePluc,单独使用第二种解决方案并没有那么有效。您可能还必须重载 operator *() 才能使其完整。顺便说一句,你为什么要避免继承?
  • 因为我用这个简单的例子来解释我想要什么,但真正的类将是一个具有不同成员的真正组合,容器也不是为了继承而设计的(我看到了你的链接:p)。在检查是否适合我之后,我将使用operator(),否则我将手动声明。我认为第二种解决方案的语法可能会产生误导,尤其是在使用指针时。
  • 只是说我接受了这个作为答案,因为它提供了一个简单语法的替代方案。真正的答案是目前还不可能:)
猜你喜欢
  • 2012-11-14
  • 1970-01-01
  • 1970-01-01
  • 2018-03-30
  • 1970-01-01
  • 1970-01-01
  • 2011-12-23
  • 2016-05-15
  • 1970-01-01
相关资源
最近更新 更多