Проблема с функцией привязки

Я использую boost (сигналы + привязка) и С++ для передачи ссылки на функцию. Вот код:

#define CONNECT(FunctionPointer) \
        connect(bind(FunctionPointer, this, _1));

Я использую это так:

class SomeClass {
  void test1() {}
  void test2(int someArg) {}

  SomeClass() {
     CONNECT(&SomeClass::test1);
     CONNECT(&SomeClass::test2);
  }
};

Привязка второй тестовой функции работает (test2), потому что у нее есть хотя бы один аргумент. При первом тесте у меня ошибка:

‘void (SomeClass::*)()’ is not a class, struct, or union type

Почему я не могу передавать функции без аргументов?


person Max Frai    schedule 23.07.2010    source источник


Ответы (1)


_1 — это аргумент-заполнитель, который означает «заменить первым входным аргументом». Метод test1 не имеет аргументов.

Создайте два разных макроса:

#define CONNECT1(FunctionPointer) connect(bind(FunctionPointer, this, _1));
#define CONNECT0(FunctionPointer) connect(bind(FunctionPointer, this));

Но помните, что макросы — зло.

И используйте это так:

class SomeClass {
  void test1() {}
  void test2(int someArg) {}

  SomeClass() {
     CONNECT1(&SomeClass::test1);
     CONNECT0(&SomeClass::test2);
  }
};
person Jorge Ferreira    schedule 23.07.2010
comment
Хорошо, я понимаю. Я знаю, что макросы злые, но тело моих макросов большое и уродливое. Конечно, если бы это было похоже на мой образец, я бы использовал его. Спасибо. - person Max Frai; 23.07.2010