Hello, just made this to make it easier for who ever makes loggers.

Code:
void GenerateClass(char* classname, char* names[], char* types[], DWORD addr[], int size) {
	stringstream ss;
	int spacer = 0;

	ss << "class " << classname << " {" << endl;
        ss << "public:" << endl;

	if(addr[0] == 0) ss << "	" << types[0] << " " << names[0] << "; //0x" << hex << addr[0] << endl;
	else {
		ss << "	char spacer" << spacer << "[0x" << hex << addr[0] << "]; //0x0" << endl;
		ss << "	" << types[0] << " " << names[0] << "; //0x" << hex << addr[0] << endl;
		spacer++;
	}

	if(size > 1) {
		for(int i = 1; i < size; i++) {
			if(addr[i] - 4 == addr[i - 1]) ss << "	" << types[i] << " " << names[i] << "; //0x" << hex << addr[i] << endl;
			else {
				ss << "	char spacer" << spacer << "[0x" << hex << (addr[i] - addr[i - 1] - 4) << "]; //0x" << (addr[i - 1] + 4) << endl;
				ss << "	" << types[i] << " " << names[i] << "; //0x" << hex << addr[i] << endl;
				spacer++;
			}
		}
	}
	
	ss << "};";

	string s = ss.str();
	const char* c = s.c_str();

	//Here you put your log function or change the type of the function and put a return
}
How to use?

Code:
char* names[] = {"InfiniteAmmo1", "InfiniteAmmo2", "InfiniteAmmo3", "Object", "Yaw", "Pitch", "NoSpread", "RapidFire", "NoRecoil", "CurrentWeapon", "Fly"}; //example
char* types[] = {/*put the types here*/};
DWORD addr[] = {/*put variables here*/};

GenerateClass("cPlayerClient", names, types, addr, /*size of the arrays*/);
If you use it give credits (Myself).