Sign in to follow this  
LevyDee

c++ syntax challenge!

Recommended Posts

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.

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

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

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!

Share this post


Link to post
Share on other sites
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). Edited by SimonForsman

Share this post


Link to post
Share on other sites
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.

[code]

struct x
{
void (*func)();

static void my_func() { }
};

int main()
{
x xx;

xx.func = x::my_func;

xx.func();
}
[/code]

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
Can't believe no one pointed this out, this is such an amateur mistake.

Simply change
[CODE]listener->*_TriggerFunction(.....); // Produces error[/CODE]
to
[CODE](listener->*_TriggerFunction)(.....); // Won't produce any error :) [/CODE] Edited by Mihai Moldovan

Share this post


Link to post
Share on other sites
[quote name='Mihai Moldovan' timestamp='1335827993' post='4936213']
(listener->*_TriggerFunction)(.....); // Won't produce any error :)
[/quote]

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

[quote]
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.

[quote]
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++

Share this post


Link to post
Share on other sites
[quote name='Slig Commando' timestamp='1335843488' post='4936304']
[quote]
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.
[/quote]
[url=http://www.parashift.com/c++-faq-lite/pointers-to-members.html#faq-33.1]I'm not sure you understood what bradbobak was getting at[/url] (read the note at the bottom of 33.1)

Share this post


Link to post
Share on other sites
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! Edited by Slig Commando

Share this post


Link to post
Share on other sites
[quote name='Slig Commando' timestamp='1335846932' post='4936313']
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.
[/quote]
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.

Share this post


Link to post
Share on other sites
Mihai Moldovan told you what the problem was a few posts ago.

[code]#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));
}

[/code]

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this