template <class Z,
std::enable_if_t<std::is_pod<Z>{}, bool> =true
>
void x()
{
std::cout << "yep" << std::endl;
}
это условно создает нетипизированный параметр шаблона типа bool
и присваивает ему true
.
Если is_pod<Z>{}
равно false, генерируется ошибка SFINAE.
Вы должны будете реализовать обратное условие в другом x
.
Альтернативой является диспетчеризация тегов:
namespace impl {
template <class Z>
void x(std::true_type /* is pod */ )
{
std::cout << "yep" << std::endl;
}
template <class Z>
void x(std::false_type /* is pod */ )
{
std::cout << "nope" << std::endl;
}
}
template<class Z>
void x() {
impl::x<Z>( std::is_pod<Z>{} );
}
, где мы используем обычное разрешение перегрузки для отправки междудва тела.Лично я считаю это самым вменяемым.