views:

40

answers:

1

Hello, I'm using boost (signals + bind) and c++ for passing function reference. Here is the code:

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

I use this like this:

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

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

Second test function binding works (test2), because it has at least one argument. With first test I have an error:

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

Why I don't able to pass functions without arguments?

+2  A: 

_1 is a placeholder argument that means "substitute with the first input argument". The method test1 does not have arguments.

Create two different macros:

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

But remember macros are evil.

And use it like this:

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

  SomeClass() {
     CONNECT1(&SomeClass::test1);
     CONNECT0(&SomeClass::test2);
  }
};
smink
Okay, I udnerstand. I know that macros are evil, but the body of my macros is big and ugly. Of course, if it would be like my sample, I'd use it.Thanks.
Ockonal