c++ - 输入trait以接收T::value_type(如果存在),否则为T

标签 c++ templates sfinae typetraits

如果类型T提供了typedef value_type,则必须提供类型为T::value_type的typedef类型T的类型特征,否则为T。

我已经尝试了以下实现,但是它似乎不起作用(即使存在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

任何的想法?

最佳答案

特化需要匹配基本模板。

基本模板具有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;

关于c++ - 输入trait以接收T::value_type(如果存在),否则为T,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62203496/

相关文章:

c++ - gcnew Image CLI/C++ 时的无效操作

模板化基类的 C++ 函数模板专门化

c++ - 如何更改 Amazon kinesis_video_gstreamer_sample_app.cpp 中的视频源?

C++ 二进制搜索函数不打印

c++ - 在分类袋中添加C++

c++ - 使用通用函数指针参数化函数模板的巧妙方法

c++ - 在 C++ 中,是否可以消除数组引用和指针之间的歧义?

c++ - 传入指定类的成员变量

c++ - 带有 std::ostream 的 declval 表达式(用于 SFINAE)

c++ - 如何检测一个类是否有成员变量?