要接收的T :: value_type的类型特征,否则为T

问题描述 投票:0回答:1

必需是类型T的类型特征,提供类型为T :: value_type的typedef type,如果T具有typedef value_typeT否则。

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

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

任何想法?

c++ templates sfinae typetraits
1个回答
2
投票

专业需要匹配基本模板。

您的基本模板具有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;
© www.soinside.com 2019 - 2024. All rights reserved.