Access to private members and methods in C++
Copy privablic.h into your project and #include "privablic.h"
, and for easy reading, add:
using namespace privablic;
Now, suppose you know the implementation of a class (or a struct) like that:
class Sheep
{
public:
Sheep(std::string name_) : name{ std::move(name_) } {}
private:
// Data
std::string name;
static int TOTAL;
// Functions
void baa() { std::cout << name << ": Baa! Baa!\n"; };
static void FlockCount()
{
std::cout << "sheperd actually counted " << TOTAL << " sheep\n";
}
};
int Sheep::TOTAL = 42;
You only have to map some stubs according to types of members and/or methods signatures:
struct Sheep_name { typedef string (Sheep::*type); };
template class private_member<Sheep_name, &Sheep::name>;
struct Sheep_baa { typedef void(Sheep::*type)(); };
template class private_method<Sheep_baa, &Sheep::baa>;
struct Sheep_TOTAL { typedef int *type; };
template class private_member<Sheep_TOTAL, &Sheep::TOTAL>;
struct Sheep_FlockCount { typedef void(*type)(); };
template class private_method<Sheep_FlockCount, &Sheep::FlockCount>;
Then, using an instance of Sheep
, you can access the private members like this:
Sheep dolly = Sheep("Dolly");
// now we have a sheep under our complete control:
// - change dolly's identity
dolly.*member<Sheep_name>::value = "Lilly";
// - make dolly baa
(&dolly->*func<Sheep_baa>::ptr)();
// - steal dolly
int flockCount = *member<Sheep_TOTAL>::value -= 1;
// - let the sheperd realize it
(*func<Sheep_FlockCount>::ptr)();
Lilly: Baa! Baa!
sheperd actually counted 41 sheeps
Works under OSX
GCC 7.x (at least!)
Visual Studio 2019 (at least!)
Copyright 2017 Michelangelo Altamore. It may be redistributed under the terms specified in the LICENSE file.