Есть несколько возможностей, например:
Специализация только метода:
template<>
void Foo<A>::say_hello() { std::cout << "Hello"; }
template<>
void Foo<B>::say_hello() { std::cout << "Hello"; }
template<>
void Foo<C>::say_hello() { std::cout << "Hello"; }
или, в C ++ 17, вы можете сделать:
template <typename T>
class Foo
{
T t_;
void say_hello()
{
if constexpr(std::is_same_v<T, A> || std::is_same_v<T, B> || std::is_same_v<T, C>) {
std::cout << "Hello";
} else {
std::cout << "Ciao";
}
}
// work with T ...
};
Принимая во внимание, что обычный if
работает в этом примере, он потерпит неудачу, если вы вызовете код с указанием c на A
, B
, C
. if constexpr
такой проблемы не будет.