Thus a void pointer seemed to be the most powerful way.
Void pointers are powerful, but you lose any kind of type checking when you use them. That is the trade off. This message system has the same problem that printf() does, and which the iostream library overcomes. There is no way to check that the argument types match the format string.
The only thing I can think of without overhauling the entire system to be type safe is a master template:
template <class T1, class T2, class T3,
class T4, class T5, class T6>
void gFont::AddTest (int passedPosition,
std::string passedString,
T1 &var1=T1(), T2 &var2=T2(), T3 &var3=T3(),
T4 &var4=T4(), T5 &var5=T5(), T6 &var6=T6())
With the default values you can pass fewer than the maximum and just ignore the ones that are not in the format string. As long as the master template supports as many parameters as you pass, it will work.