/******************************************************************************
Welcome to GDB Online.
GDB online is an online compiler and debugger tool for C, C++, Python, PHP, Ruby,
C#, OCaml, VB, Perl, Swift, Prolog, Javascript, Pascal, COBOL, HTML, CSS, JS
Code, Compile, Run and Debug online from anywhere in world.
*******************************************************************************/
#include <stdio.h>
#include <iostream>
template <class Stub>
struct member { static typename Stub::type value; };
// статик переменная для общего шаблона
template <class Stub>
typename Stub::type member<Stub>::value;
// подмена типа и получение адреса приватной переменной
// stub уйдет дальше в класс member, чтобы имять статик переменную для этого типа
template <class Stub, typename Stub::type x>
struct private_member {
private_member() { member<Stub>::value = x; } // сохранение адреса переменной
static private_member instance;
};
template <class Stub, typename Stub::type x>
private_member<Stub, x> private_member<Stub, x>::instance;
// тесткейс
struct PapaPavlica {
private:
char const* papini_dengi = "papini dengi";
};
// подменный тип, чтобы компилятор не пугался нарушением прав доступа
struct A_x { typedef char const *(PapaPavlica::*type); };
// магия, здесь живут драконы
template struct private_member<A_x, &PapaPavlica::papini_dengi>;
int main() {
PapaPavlica papa;
std::cout << papa.*member<A_x>::value << std::endl; // papini_dengi
// разворачиваем обратно полученный адрес в переменную
// получаем *(papa).(&PapaPavlica::papini_dengi) = "deneg net"
papa.*member<A_x>::value = "deneg net";
std::cout << papa.*member<A_x>::value << std::endl; // deneg net
}
/******************************************************************************
Welcome to GDB Online.
GDB online is an online compiler and debugger tool for C, C++, Python, PHP, Ruby,
C#, OCaml, VB, Perl, Swift, Prolog, Javascript, Pascal, COBOL, HTML, CSS, JS
Code, Compile, Run and Debug online from anywhere in world.
*******************************************************************************/
#include <stdio.h>
#include <iostream>
template <class Stub>
struct member { static typename Stub::type value; };
// статик переменная для общего шаблона
template <class Stub>
typename Stub::type member<Stub>::value;
// подмена типа и получение адреса приватной переменной
// stub уйдет дальше в класс member, чтобы имять статик переменную для этого типа
template <class Stub, typename Stub::type x>
struct private_member {
private_member() { member<Stub>::value = x; } // сохранение адреса переменной
static private_member instance;
};
template <class Stub, typename Stub::type x>
private_member<Stub, x> private_member<Stub, x>::instance;
// тесткейс
struct PapaPavlica {
private:
char const* papini_dengi = "papini dengi";
};
// подменный тип, чтобы компилятор не пугался нарушением прав доступа
struct A_x { typedef char const *(PapaPavlica::*type); };
// магия, здесь живут драконы
template struct private_member<A_x, &PapaPavlica::papini_dengi>;
int main() {
PapaPavlica papa;
std::cout << papa.*member<A_x>::value << std::endl; // papini_dengi
// разворачиваем обратно полученный адрес в переменную
// получаем *(papa).(&PapaPavlica::papini_dengi) = "deneg net"
papa.*member<A_x>::value = "deneg net";
std::cout << papa.*member<A_x>::value << std::endl; // deneg net
}