You are right in that you shouldn't have to write this code, but you are wrong about the templates.
Templates are not suited to putting different print functions together because they only handle different types, not different code.
The code to display an int is nothing like the code to display a string. That's why there should be code to display an int, plus completely different piece of code to display a string, or a float etc.
// dbPrint(char*) is already defined
void dbPrint(int Value)
{
char Buffer[15];
itoa(Value, Buffer, 10);
dbPrint(Buffer); // Reuse the original string function
}