Элегантный способ реализации мультиплексирования вызовов в агрегатном классе C ++?

При мультиплексировании вызовов ко многим подобъектам, какой элегантный способ предотвратить циклический шаблонный код?

Описание проблемы на примере:

struct Foo {
  void Boo();
  void Hoo();
  bool IsActivated();
};

struct FooAggregator {
  ...
  void Boo();
  void Hoo();
  ...
  std::vector<Foo> m_foos;
};

FooAggregator::Boo() {
  for(size_t i=0, e=m_foos.size(); i!=e; ++i) {
    if(m_foos[i].IsActivated()) {
      m_foos[i].Boo();
    }
  }
}

FooAggregator::Hoo() {
  for(size_t i=0, e=m_foos.size(); i!=e; ++i) {
    if(m_foos[i].IsActivated()) {
      m_foos[i].Hoo();
    }
  }
}

Как видите, FooAggregator реализует тот же (аналогичный) интерфейс, что и один Foo, выполняющий итерацию по всем объектам Foo, вызывающим их соответствующие функции-члены.

Как вы также можете видеть, цикл итераций является полным шаблоном, повторяющимся для каждой функции-члена FooAggregator.

Какой элегантный способ удаления шаблон из реализации функций-членов FooAggregators

6
задан Martin Ba 20 May 2011 в 09:07
поделиться