C ++中对象的继承和deque

时间:2012-10-01 12:27:16

标签: c++ inheritance deque

我有多个控件组织如下:

deque<wxTextCtrl*> dequeEdit;
deque<wxStaticText*> dequeText;
deque<wxComboBox*> dequeCombo;

所有这些控件都继承自具有mathod Show的wxWindow。我想立刻显示(或隐藏)整个双端队列,而不需要为每个双端队列提供多种方法。怎么可能呢?

我正在考虑为每个控件创建wxWindow的deque,所以我可以编写方法

ShowDeque(deque<wxWindow*> deque)

所以显示会很容易,但另一方面,如果我愿意使用例如组合框,我必须将它键入wxComboBox。 还有其他可能吗?感谢。

3 个答案:

答案 0 :(得分:2)

使用:

for_each(dequeEdit.begin(), dequeEdit.end(), mem_fun(&wxWindow::Show));

任何其他deques相同。

或封装在一个函数中:

template <class Deque>
void showAll(const Deque& dequeObj)
{
   using namespace std;
   for_each(dequeObj.begin(), dequeObj.end(), mem_fun(&wxWindow::Show));
}

showAll(dequeEdit);
  1. std::for_eachhttp://en.cppreference.com/w/cpp/algorithm/for_each
  2. std::mem_funhttp://en.cppreference.com/w/cpp/utility/functional/mem_fn

答案 1 :(得分:1)

您可以使用功能模板。

template <typename T>
void show_all(const std::deque<T*>& d) {
    for (typename std::deque<T*>::iterator it=d.begin(); it!=d.end(); ++it)
        (*it)->Show();
}

然后你可以像普通函数一样调用它。

deque<wxTextCtrl*> dequeEdit;
deque<wxStaticText*> dequeText;
deque<wxComboBox*> dequeCombo;

show_all(dequeEdit);
show_all(dequeText);
show_all(dequeCombo);

使用函数模板,您甚至可以通过添加其他模板参数使show_all独立于您使用的容器。

template <typename C, typename T>
void show_all(const C<T*>& d) {
    for (typename C<T*>::iterator it=d.begin(); it!=d.end(); ++it)
        (*it)->Show();
}

C可以是任何STL容器,甚至是支持相同迭代器接口的任何容器。

答案 2 :(得分:1)

如果这是一个简单的方法,请将其作为模板:

template <typename WxT>
void ShowDeque(std::deque<WxT*> &d) { ... }

或更好,使用迭代器抽象出容器类型:

template <typename WxIter>
void ShowDeque(WxIter begin, WxIter end) { ... }

或者更好的是使用标准设施(Piotr在打字的时候打败了我!)