У меня есть несколько элементов управления, организованных следующим образом:
deque<wxTextCtrl*> dequeEdit;
deque<wxStaticText*> dequeText;
deque<wxComboBox*> dequeCombo;
Все эти элементы управления наследуются от wxWindow, который имеет метод Show. Я хотел бы показать (или скрыть) целую деку сразу, без необходимости использования нескольких методов для каждой декы. Как это можно сделать?
Я думал о создании deque wxWindow для каждого элемента управления, чтобы я мог написать метод
ShowDeque(deque<wxWindow*> deque)
так что показывать было бы легко, но с другой стороны, если бы я хотел работать, например, с combobox, я должен был бы напечатать это назад к wxComboBox.
Есть ли другие возможности? Благодарю.
Использование:
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);
std::for_each
: http://en.cppreference.com/w/cpp/algorithm/for_eachstd::mem_fun
: http://en.cppreference.com/w/cpp/utility/functional/mem_fnЕсли это простой метод, сделайте его шаблоном:
template <typename WxT>
void ShowDeque(std::deque<WxT*> &d) { ... }
или лучше использовать итераторы для абстрагирования типа контейнера:
template <typename WxIter>
void ShowDeque(WxIter begin, WxIter end) { ... }
или, что еще лучше, используйте стандартные возможности (Петр опередил меня, пока я печатал!)
Вы можете использовать шаблон функции.
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 или даже любым контейнером, который поддерживает тот же интерфейс итератора.