键入特征以接收 T::value_type(如果存在),否则为 T

Type trait to receive T::value_type if present, T otherwise

Required 是类型 T 的类型特征,提供类型定义 type 类型 T:: value_type 如果 T 有一个类型定义 value_type, T 否则。

我尝试了以下实现,但它似乎不起作用(typedef 始终是 T 类型,即使 T::value_type 存在):

template <class T, class = void> struct value_type { using type = T; };
template <class T> struct value_type<T, typename T::value_type> { using type = typename T::value_type; };

template <class T> using value_type_t = typename value_type<T>::type;

std::is_same_v<value_type_t<int>, int> // true
std::is_same_v<value_type_t<std::optional<int>>, int> // false, should be true

有什么想法吗?

专业化需要匹配基本模板。

您的基本模板具有 class = void,这意味着您的专业化中的第二个参数需要为空才能匹配。

这样做的方法是使用类似 std::void_t 的东西,无论我们放入什么,它都会变得无效。这里的唯一目的是允许 SFINAE,如果 T::value_type 有效,我们总是得到 void.

template <class T, class = void> struct value_type { using type = T; };
template <class T> struct value_type<T, std::void_t<typename T::value_type>> { using type = typename T::value_type; };

template <class T> using value_type_t = typename value_type<T>::type;