我有多个控件组织如下:
deque<wxTextCtrl*> dequeEdit;
deque<wxStaticText*> dequeText;
deque<wxComboBox*> dequeCombo;
所有这些控件都继承自具有mathod Show的wxWindow。我想立刻显示(或隐藏)整个双端队列,而不需要为每个双端队列提供多种方法。怎么可能呢?
我正在考虑为每个控件创建wxWindow的deque,所以我可以编写方法
ShowDeque(deque<wxWindow*> deque)
所以显示会很容易,但另一方面,如果我愿意使用例如组合框,我必须将它键入wxComboBox。 还有其他可能吗?感谢。
答案 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);
std::for_each
:http://en.cppreference.com/w/cpp/algorithm/for_each std::mem_fun
:http://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在打字的时候打败了我!)