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
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.
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.
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);