Как сделать класс способным вызывать массив функций других классов? - PullRequest
0 голосов
/ 17 января 2011

Нам нужен класс с двумя методами add () и call ().Когда мы создаем класс, мы можем добавить с помощью функции add () функцию, которую хотим вызывать, когда call () будет вызываться с такими параметрами, как (псевдокод)

new A;
new B;
A.add(B.function(int)) // B takes int as an argument
A.call(); // and call() would look like {int i; sendArrayOfSubscribers(i);}
//now we know that B.function was executed with param generated in A;

Возможна ли такая структура в C ++?

Ответы [ 2 ]

3 голосов
/ 17 января 2011

Ваш код очень неясен, но кажется, что вы хотите настроить массив задач, а затем выполнить их все.

Вы можете использовать boost :: function для создания каждой функции и иметь коллекцию (vector) из них.

Затем вызовите каждую функцию.Что-то вроде:

typedef boost::function< void (void) > func_type;
std::vector< func_type > funcs;
// populate funcs, 
std::for_each( funcs.begin(), funcs.end(), boost::bind(&func_type::operator(),_1) );

должно работать.(Там может быть более простая конструкция)

Вы используете больше boost :: binds для создания своей коллекции "funcs".Функции не должны принимать никаких параметров, они могут принимать int, как вам требуется.Вы передаете это при привязке, например:

funcs.push_back( boost::bind( &B::function, b, i ) );

, где "b" - это экземпляр b, а i - это параметр, который он принимает как int.

2 голосов
/ 17 января 2011

Попробуйте это (мне пришлось переименовать do, это ключевое слово в C ++):

#include <iostream>
#include <vector>

using namespace std ;

typedef void FuncInt (int) ;

class A {
public:
  void add (FuncInt* f) ;
  void call() ;  
private:
  vector<FuncInt*> FuncVec ;
} ;

void A::add (FuncInt* f) {
  FuncVec.push_back (f) ;
}

void A::call() {
  for (size_t i = 0 ; i < FuncVec.size() ; i++)
    FuncVec[i] (i) ;
}

static void f0 (int i) { cout << "f0(" << i << ")" << endl ; }
static void f1 (int i) { cout << "f1(" << i << ")" << endl ; }

int main() {
  A a ;
  a.add (f0) ;
  a.add (f1) ;
  a.call() ;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...