This should work, will give error on a serial number not on micro, can modify it to return default when not available if needed.
template< int i_Number > class SerialSelector;
template<> struct SerialSelector< 0 >{ static inline HardwareSerial &Get( void ){ return Serial; } };
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
template<> struct SerialSelector< 1 >{ static inline HardwareSerial &Get( void ){ return Serial1; } };
template<> struct SerialSelector< 2 >{ static inline HardwareSerial &Get( void ){ return Serial2; } };
template<> struct SerialSelector< 3 >{ static inline HardwareSerial &Get( void ){ return Serial3; } };
#endif
Your class
template< int _Serial > class YourClass{
public:
YourClass(void) : port( SerialSelector< _Serial >::Get() )
{ return; }
private:
HardwareSerial &port;
};
P.S. 'this->' is fine, it was implemented for a reason.