Skip to content

Access to private members and methods of a C++ struct or class

License

Notifications You must be signed in to change notification settings

matthew-limbinar/privablic

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

31 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

privablic logo

Access to private members and methods in C++

How to use it

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:

Instance Member

struct Sheep_name { typedef string (Sheep::*type); };
template class private_member<Sheep_name, &Sheep::name>;

Instance Method

struct Sheep_baa { typedef void(Sheep::*type)(); };
template class private_method<Sheep_baa, &Sheep::baa>;

Static Instance Member

struct Sheep_TOTAL { typedef int *type; };
template class private_member<Sheep_TOTAL, &Sheep::TOTAL>;

Static Instance Method

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

Output:

Lilly: Baa! Baa!
sheperd actually counted 41 sheeps

Tested compilers which works with

clang

Works under OSX

gcc

GCC 7.x (at least!)

msvc

Visual Studio 2019 (at least!)

Credits

License

Copyright 2017 Michelangelo Altamore. It may be redistributed under the terms specified in the LICENSE file.

About

Access to private members and methods of a C++ struct or class

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • C++ 98.7%
  • Makefile 1.3%