在向量中添加或删除项目时调用函数

时间:2011-07-24 09:23:43

标签: c++ stl vector

我正在为Nano-X窗口系统编写一个小部件工具包。在我的基类view中,我定义了一个向量:

std::vector<RSMKit::View *> children;

在向量中添加或删除项目时是否可以调用函数(在这种情况下为GrReparentWindow),以便显示新添加的小部件?

4 个答案:

答案 0 :(得分:4)

不,这是不可能的。您也不应该将std::vector子类化为覆盖push_backerase,因为该类尚未针对它进行设计。但是,编写自己的容器(使用std::vector进行存储并使用回调公开AddRemove函数会很简单。以下内容:

template<typename T>
class CallbackVector
{
public:

    typedef void (*Callback)();

private:

    std::vector<T> elements;
    Callback       OnAdd;
    Callback       OnRemove;

public:

    CallbackVector(Callback OnAdd, Callback OnRemove)
        : OnAdd    (OnAdd)
        , OnRemove (OnRemove)
    {
    }

    void Add(const T & element)
    {
        elements.push_back(element);
        OnAdd();
    }

    void Remove(int i)
    {
        elements.erase(elements.begin() + i);
        OnRemove();
    }
};

在实践中,你可能想要一个更复杂的回调,使用带有指针参数的函数或使用boost::function

答案 1 :(得分:1)

没有。不要继承std::vector。只是封装它。

template<typename T> struct MyVector
{
private:
    std::vector<T> items;
public:
    void push_back (const T& x)
    {
        // Do something here
        items.push_back(x);
    }
    // etc
};

答案 2 :(得分:0)

一种可能的解决方案是对vector类进行子类化,并在插入和删除方法上添加回调。使用stl向量时,默认情况下这是不可能的

答案 3 :(得分:0)

有两种方式;

(1)继承std::vector并重载push_back()pop_back()方法:

template<typename T>
struct MyVector : std::vector<T>
{
  void push_back (const T& x)
  {
    GrReparentWindow ();
    vector<T>::push_back(x);
  }
  // same way pop_back()
};

用法:

MyVector<RSMKit::View*> children;
children.push_back(new RSMKint::View);

(2)另一种方法是push_back具有自定义重载运算符或方法的项目;如果您被允许编辑RSMKit::View

class RSMKit::View
{
//...
public:
  RSMKit::View* get ()
  {
    GrReparentWindow ();
    return this;
  }
};

用法:

MyVector<RSMKit::View*> children;
RSMKit::View *p = new RSMKint::View;
children.push_back(p->get());