【问题标题】:how to override STL container function如何覆盖 STL 容器函数
【发布时间】:2017-07-05 13:31:18
【问题描述】:

有可能覆盖一些具有相同参数的函数 stl 容器吗? 我想用一些if 内部函数完全覆盖push_back。 我尝试过,但总是有关于该函数的错误/信息在向量中。

【问题讨论】:

  • 不,您不能更改vector。听起来像一个XY问题。你真正需要完成的是什么?
  • 你不能把你需要做的检查在函数之外,所以你只调用push_back并匹配正确的条件吗?
  • 如果您的代码出现编译器错误,请发布产生该错误的minimal reproducible example
  • 我想检查大小元素 push_back 到容器并在他执行某些条件时添加。

标签: c++ stl


【解决方案1】:

覆盖意味着你要从 STL 容器继承。不要那样做! STL 容器不是为继承而设计的。


作为一种选择,您可以将 std::vector 封装到一些包装类中,并在推送之前执行其他功能,例如:

template<typename T>
class Wrapper
{
public:
    template<typename U>
    void push(U&& e)
    {
         // some additional processing
         data.push_back(std::forward<U>(e));
    }

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

【讨论】:

    【解决方案2】:

    STL 容器的继承是不好的方法。该向量不应该具有派生类。向量和虚拟析构函数中没有虚拟方法(最后一个可能会产生很多问题)。 您可以创建自己的类并使用向量作为成员。

    【讨论】:

      【解决方案3】:

      你不能那样做。 std 库中的大多数类并不意味着继承自。但是,与其“从内部”更改它,不如“从外部”进行更改,例如:

      template<typename T> myPush(std::vector<T>& v,T element) {
          if (someCondition()) { v.push(element); }
      }
      

      或者,您可以这样做:

      struct MyCustomVector {
           void my_push( T element);
           /* pulic or private: */          // depends on what you want/need
           std::vector<T> vect;
      };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-08
        • 1970-01-01
        • 1970-01-01
        • 2011-07-21
        • 2016-05-04
        相关资源
        最近更新 更多