1

我有多个这样组织的控件:

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

所有这些控件都继承自 wxWindow,它具有显示方法。我想一次显示(或隐藏)整个双端队列,而不需要为每个双端队列使用多种方法。怎么可能做到?

我正在考虑为每个控件制作 wxWindow 的双端队列,所以我可以编写方法

ShowDeque(deque<wxWindow*> deque)

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

4

3 回答 3

2

利用:

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

对于任何其他双端队列也是如此。

或者封装在一个函数中:

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
于 2012-10-01T12:31:10.433 回答
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 容器,甚至可以是任何支持相同迭代器接口的容器。

于 2012-10-01T12:32:01.240 回答
1

如果它是一个简单的方法,让它成为一个模板:

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

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

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

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

于 2012-10-01T12:32:25.997 回答