struct pointer function points to other function of other struct

后端 未结 3 1606
天命终不由人
天命终不由人 2021-01-24 16:27

I was wondering if is possible to point a function of other structure into of a structure:

Example:

typedef struct
{
    int func(int z)
    {
        r         


        
相关标签:
3条回答
  • 2021-01-24 17:09

    The correct syntax for a pointer to method is:

    &T::f
    

    Where T is a type declaring a method f. Note that to be called, the pointer must be bound to an instance of T, because the value of the pointer represents an offset to the beginning of an instance in memory.

    In C++14, you may consider std::function:

    #include <functional>
    
    struct sta
    {
        int func(int z)
        {
            return z * 2;
        }
    };
    
    struct stah
    {
        std::function<int(int)> func;
    };
    
    
    int main()
    {
        sta sa;
        stah sah;
    
        sah.func = std::bind(&sta::func, &sa, std::placeholders::_1);
    
        return 0;
    }
    

    You can also use lambdas instead of std::bind:

    int main()
    {
        sta sa;
        stah sah;
    
        sah.func = [&sa](int z) { return sa.func(z); };
    
        return 0;
    }
    

    See std::function, std::bind, and std::placeholders on cppreference.com.

    0 讨论(0)
  • 2021-01-24 17:11

    After trying and trying, the solution it was something like this:

    Example:

    typedef struct 
    {
        int a;
    
        int SomeFunc(int a)
        {
            return a * 4;
        }
    
    } somst;
    
    
    typedef struct
    {
        int a;
        int (*HGetValX)(int);
    } hst;
    
    
    int main()
    {
        hst* a;
        hst decfunc; // New instance
        somst b;
    
        decfunc.HGetValX = (int(*)(int))0x421C10; // memory address, or &b.SomeFunc; | &b.SomeFunc; Produces warnings.
        b.a = 20;
    
        a = (hst*)&b;
    
    
        cout << decfunc.HGetValX(4) << b.SomeFunc(4) << a->a <<  endl;
    
        return 0;
    }
    

    Finding memory address

    then the code compiles without warnings, the objective is hook the structure with their functions.

    0 讨论(0)
  • 2021-01-24 17:15

    The declaration of func should look like this:

    int(sta::*func)(int);
    

    Or, alternatively:

    using my_type = int(sta::*)(int);
    my_type func;
    

    This is easier to read: my_type is an alias for the type pointer to a member function of sta that gets an int and returns an int.
    func is nothing more that a data member having type my_type.

    In order to assign an actual pointer to member function to func, you can do this instead:

    sah.func = &sta::func;
    

    You can then invoke it as it follows:

    (sa.*sah.func)(0);
    
    0 讨论(0)
提交回复
热议问题