Начиная с C ++ 17, вы можете использовать if constexpr (!std::is_same_v<T, T3>)
, как предлагается в ответе сонгюаняо.
В C ++ 11 / C ++ 14 я предлагаю два способа.
(1) отправка меток
template <typename T>
void printData (T param, std::true_type)
{ }
template <typename T>
void printData (T param, std::false_type)
{ std::cout << param.getData() << std::endl; }
template <typename T>
void printData (T param)
{ printData(param, std::is_same<T, T3>{}); }
(2) SFINAE
// ever enabled
template <typename T>
void printData (T param, long)
{ }
// preferred (int instead of long) but enabled only
// when param support getData()
template <typename T>
auto printData (T param, int)
-> decltype( param.getData(), void() )
{ std::cout << param.getData() << std::endl; }
template <typename T>
void printData (T param)
{ printData(param, 0); }