This section of the archives stores flipcode's complete Developer Toolbox collection, featuring a variety of mini-articles and source code contributions from our readers.

| Function Pointers To Member Functions Submitted by

I was faced with a problem with function pointers not so long ago. Specifically having a function ptr to a non static class member function ...
Having a member variable pointing to a member function is no problem as is having a variable pointing to a static member function.
But there is no documented way to store a pointer to a non-static member function outside of the class.
Yes, I know, you could still pass a pointer to the class to your function so it will be able to call non-static functions but it just doesn't seems right/efficient...
Well, here's what I came up with:

    //***************************
    // Save the pointer
    //***************************

    // in_pFunction is of type : void (CClassName::*in_pFunction)() in this example
    // The compiler won't let you store the address of a non static function if you
    // don't store it in a member variable of the class. But, it will let you use the
    // address of the pointer ;-)

    // Store the function pointer in a variable
    void *pData = *( (void **) &in_pFunction );

    // you can now store pData wherever you want since it's a void ptr

    //***************************
    // Use the pointer
    //***************************
    // Now that our pointer is safely stored, we have to get it back.
    // We can't cast a pointer to a non static member function pointer so we use the
    // address of the pointer and change the value it's pointing to :-)

    // Declare a variable to store the function pointer.
    void (CClassName::*pClassFunction)() = NULL;

    // Because we can't cast our void pointer to a member function pointer, store the
    // address of the function pointer
    void **ppvFunction = ( ( void ** ) &pClassFunction );

    // pData contains the pointer stored earlier...
    // Since *ppvFunction is the same as pClassFunction we can assign it the value
    // that was stored in our void pointer pData
    *ppvFunction = pData;

    // Call the function a pointer to the class
    // If we were to use the pointer directly, the function will be called by creating
    // a temporary instance of the call
    (this-*pClassFunction)();

The zip file viewer built into the Developer Toolbox made use of the zlib library, as well as the zlibdll source additions.

Copyright 1999-2008 (C) FLIPCODE.COM and/or the original content author(s). All rights reserved.
Please read our Terms, Conditions, and Privacy information.