Do you think, on the off-chance that others want to use this too... That there is an issue with having the lcd variable? (Other's may call their LiquidCrystal instance something else)...
Is it worth maybe adding:
namespace CenterAlign {
LiquidCrystal_I2C* lcd = nullptr;
template<typename T>
void LCDPrint(T t, uint8_t row, bool clear = false) {
if (!CenterAlign::lcd) return;
// ..... etc etc including replacing lcd.print to lcd->print ...
}:
And making the user set the pointer like:
LiquidCrystal_I2C theirLCD(0x27, 16, 2);
CenterAlign::lcd = &theirLCD;
CenterAlign::LCDPrint(x, 1);
?