2012-10-01 47 views
1

对象的双端队列我有这样的组织多个控件:继承和C++

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

所有这些控件从wxWindow的已马托显示继承。我想立即显示(或隐藏)整个deque,而不需要为每个deque提供多种方法。它怎么能做到?

我还想着做wxWindow的双端队列的每个控制,这样我就可以写方法

ShowDeque(deque<wxWindow*> deque) 

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

回答

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
+0

应mem_fun不mem_fun_ref。 –

+0

@BleepBloop - 谢谢! – PiotrNycz

+0

@ChristianSeverin谢谢! – PiotrNycz

2

您可以使用函数模板。

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容器,或甚至任何容器,其支持相同的迭代器接口。

+0

忘了'typename'。 – Puppy

+0

@DeadMG:修正,谢谢。 –

1

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

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

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

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

或更好,但使用标准设备(彼得·节拍我是一个,而我打字!)