В C++17
, void_t
можно легко делать SFINAE с class
/struct
шаблонами:
template <class T, class = void>
struct test {
static constexpr auto text = "general case";
};
template <class T>
struct test<T, std::void_t<decltype(std::begin(std::declval<T>())>> {
static constexpr auto text = "has begin iterator";
};
То, что находится внутри void_t
, является типом. Мой вопрос: как сделать то же самое, когда то, что внутри void_t
, является чертой типа. Использование enable_if
работает хорошо:
template <class T>
struct test<T, std::void_t<std::enable_if_t<std::is_class_v<T>>> {
static constexpr auto text = "is a class";
};
Есть ли более короткий/элегантный способ написать это или правильный способ сделать это, действительно объединить void_t
и enable_if
?