#include <iostream>
using namespace std;

class Product
{
public:
    int ID;
    std::string Designation;
};
 
struct Property
{
    std::string Name;
    int Shift;
};

class ProductSchema
{
private: 
    ProductSchema();
public: 
    static ProductSchema& Default();
    ProductSchema(const ProductSchema& other) = delete;
    Property ID;
    Property Designation;
    Property Prix;
};
ProductSchema::ProductSchema()
{  
    ID.Name = "ID";
    ID.Shift = offsetof(Product, ID);    

    Designation.Name = "Designation";
    Designation.Shift = offsetof(Product, Designation);
}

ProductSchema& ProductSchema::Default()
{
    static ProductSchema instance_;
    return instance_;
}

int main()
{     
    Product p;
    p.ID = 12345;
    cout << "Before: " << p.ID << endl;
    int* pID = reinterpret_cast<int*>(reinterpret_cast<uintptr_t>(&p) + ProductSchema::Default().ID.Shift);
    *pID = 67890;
    cout << "After: " << p.ID << endl;
}