c++ syntax challenge!

Started by
8 comments, last by alvaro 12 years ago
I can't figure out the syntax on this one, and I need your help!

So heres the situation.

I have a member function pointer
void (EventListener::*_TriggerFunction)(EVENT evnt, int senderID)

Nothing fancy.

The problem is, normally you would simply call it like so
this->*_TriggerFunction(....)

but this does not work in a static member function. You get a "non-static member reference" error.


static void Blah(void* obj)
{
EventListener* listener = static_cast<EventListener*>(obj)

listener->*_TriggerFunction(.....); //Produces error.
}


One solution is to make another member function that is non static, that you call, which inturn calls _TriggerFunction,
but that seems messy and not correct.

Sorry I am not on my regular computer, otherwise I would post some actual code, but I hope this explains my situation!

Thanks!
Advertisement
Adding a non static method might be the easiest solution, I can't think of any "proper" way to do it (Allthough i tend to avoid static methods in general).
[size="1"]I don't suffer from insanity, I'm enjoying every minute of it.
The voices in my head may not be real, but they have some good ideas!
I tihnk that because it is a static member function, its treated like a standalone function so you just use a standard non-member function pointer.



struct x
{
void (*func)();

static void my_func() { }
};

int main()
{
x xx;

xx.func = x::my_func;

xx.func();
}
What you do is use boost::function or std::function (if C++11 is available). You can also use any of the other various libraries that provide function/functor wrappers.

In time the project grows, the ignorance of its devs it shows, with many a convoluted function, it plunges into deep compunction, the price of failure is high, Washu's mirth is nigh.

Can't believe no one pointed this out, this is such an amateur mistake.

Simply change
listener->*_TriggerFunction(.....); // Produces error
to
(listener->*_TriggerFunction)(.....); // Won't produce any error :)

(listener->*_TriggerFunction)(.....); // Won't produce any error :)


I tried that, but it does not fix any thing =(


I tihnk that because it is a static member function, its treated like a standalone function so you just use a standard non-member function pointer.
[/quote]
It is a private function pointer that points to a protected member function for inheritance reasons.


What you do is use boost::function or std::function (if C++11 is available). You can also use any of the other various libraries that provide function/functor wrappers.
[/quote]

That may solve the problem, but all boost is, is a helper library, its not doing anything magical that you cannot do with native c++


I tihnk that because it is a static member function, its treated like a standalone function so you just use a standard non-member function pointer.

It is a private function pointer that points to a protected member function for inheritance reasons.
[/quote]
I'm not sure you understood what bradbobak was getting at (read the note at the bottom of 33.1)
[size=2][ I was ninja'd 71 times before I stopped counting a long time ago ] [ f.k.a. MikeTacular ] [ My Blog ] [ SWFer: Gaplessly looped MP3s in your Flash games ]
Im sorry, I was not very clear =(. The function pointer points to a non-static member function, and I am trying to call that non-static member function(via pointer) in a member static function.

Anyways, the reason I was attempting to do it in a static function was because it was a thread entry function, but I can just change the thread entry function to call a non-static function and loop in there(instead of the static thread entry).

Thanks for taking the time to respond!

Im sorry, I was not very clear =(. The function pointer points to a non-static member function, and I am trying to call that non-static member function(via pointer) in a member static function.

Ah, I see. Sorry I misunderstood you.

Just a slight pointer on style: don't use identifiers that either start with an underscore followed by an upper case letter or start with two underscores. Identifiers like these are reserved for the compiler, and you're just asking for headaches in the future if you ignore this.
[size=2][ I was ninja'd 71 times before I stopped counting a long time ago ] [ f.k.a. MikeTacular ] [ My Blog ] [ SWFer: Gaplessly looped MP3s in your Flash games ]
Mihai Moldovan told you what the problem was a few posts ago.

#include <iostream>

typedef int EVENT;

struct EventListener {
void f(EVENT, int) { std::cout << "f\n";}
void g(EVENT, int) { std::cout << "g\n";}
};

void (EventListener::*_TriggerFunction)(EVENT evnt, int senderID);

static void Blah(void* obj) {
EventListener* listener = static_cast<EventListener*>(obj);

(listener->*_TriggerFunction)(0,0); // Seems to work
}

int main() {
EventListener el;
_TriggerFunction = &EventListener::f;
Blah(static_cast<void *>(&el));
}

This topic is closed to new replies.

Advertisement