Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- struct enigma_vtable;
- struct object_locals {
- double x, y;
- virtual enigma_vtable *get_vtable() = 0;
- };
- struct enigma_vtable {
- double object_locals::* x, object_locals::* y;
- int object_locals::* one;
- int object_locals::* two;
- };
- struct object0 : object_locals {
- double foo, bar, baz, qux;
- int one;
- double the, quick, brown, fox;
- int two;
- static enigma_vtable vtable;
- enigma_vtable *get_vtable() override { return &vtable; };
- };
- enigma_vtable object0::vtable = {
- &object0::x,
- &object0::y,
- (int object_locals::*) &object0::one,
- (int object_locals::*) &object0::two
- };
- struct object1 : object_locals {
- double foo;
- int one;
- double bar, baz;
- int two;
- static enigma_vtable vtable;
- enigma_vtable *get_vtable() override { return &vtable; };
- };
- enigma_vtable object1::vtable = {
- &object1::x,
- &object1::y,
- (int object_locals::*) &object1::one,
- (int object_locals::*) &object1::two
- };
- struct instance_t {
- object_locals *ref;
- enigma_vtable *vtable;
- instance_t(object_locals *direct_ref):
- ref(direct_ref), vtable(ref->get_vtable()) {}
- enigma_vtable* operator->() { return vtable; }
- };
- #include <iostream>
- using namespace std;
- int main() {
- object0 inst0;
- object1 inst1;
- inst0.x = 1337;
- inst0.y = 1338;
- inst0.one = 1339;
- inst0.two = 13310;
- inst1.x = 512;
- inst1.y = 1024;
- inst1.one = 2048;
- inst1.two = 4096;
- instance_t inst = &inst0;
- cout << inst.ref->*inst->x << endl;
- cout << inst.ref->*inst->y << endl;
- cout << inst.ref->*inst->one << endl;
- cout << inst.ref->*inst->two << endl;
- inst = &inst1;
- cout << inst.ref->*inst->x << endl;
- cout << inst.ref->*inst->y << endl;
- cout << inst.ref->*inst->one << endl;
- cout << inst.ref->*inst->two << endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement