1

私はこのように編成された複数のコントロールを持っています:

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

これらのコントロールはすべて、mathodShowを備えたwxWindowから継承されます。各両端キューに複数のメソッドを必要とせずに、両端キュー全体を一度に表示(または非表示)したいと思います。どうすればそれができますか?

コントロールごとにwxWindowの両端キューを作成することを考えていたので、メソッドを記述できました

ShowDeque(deque<wxWindow*> deque)

したがって、表示は簡単ですが、一方で、コンボボックスなどを使用する場合は、wxComboBoxに入力し直す必要があります。他に可能性はありますか?ありがとう。

4

3 に答える 3

2

使用する:

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

他の両端キューについても同じです。

または、1つの関数にカプセル化します。

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 に答える