#include #include #include #include // C++20 /* template struct element_type { using type = void; }; template concept has_value_type = requires(T data) { typename T::value_type; }; template struct element_type { using type = typename T::value_type; }; */ // C++17 template typename T::value_type element_type_helper(int); template void element_type_helper(double); template struct element_type { using type = decltype(element_type_helper(0)); }; // Shared between C++20 and C++17 template struct element_type { using type = T; }; template struct element_type { using type = T; }; int main() { static_assert( std::is_same_v::type, void> ); static_assert( std::is_same_v::type, double> ); static_assert( std::is_same_v::type, bool> ); static_assert( std::is_same_v>::type, int> ); static_assert( std::is_same_v>::type, char> ); }