为什么所有type_traits类都必须使用 'typename' 和'::type'前缀/后缀调用?

Why do all type_traits Classes have to be called using 'typename' and '::type' Prefix/Suffix?

本文关键字:type typename 调用 后缀 前缀 traits 为什么      更新时间:2023-10-16

这是一个奇怪的问题,尽管它很明显:

为什么<type_traits>中的所有模板都必须使用typenname::type前缀/后缀进行调用?

当然,其中一个原因是没有像C++0x using那样的模板化typedef,它允许以下内容:

template<typename T>
using remove_ref = typename std::remove_reference<T>::type;
remove_ref<int&> foo = 4;

因此,这个问题不是关于为什么目前是这样,而是关于在未来的C++标准中这种行为是否会被简化

类似的改进可能伴随着std::is_pointer<T>::value这样的特性——我已经在C++14/17的范围内看到了模板化常数,这将允许使用std::is_pointer<T>这样的特性。

注意:据我所知,这一简化不属于即将发布的C++标准的任何已发布项目的主题。在这种情况下,这个问题没有真正的是/否答案,这个线程可以作为一个赞成/反对列表,无论这在任何新版本的C++中是否可能改变。

编辑:

感谢@Drew_Dormann和@erenon正确地指出,已经有_t版本添加到所有类型特征模板中,可以做到这一点。

然而,除了std::is_pointer<T>()-版本之外,是否有任何迹象表明像std::is_pointer这样的价值特征将成为类似简化的一部分?

在c++14中,有remove_reference_t,这正是您想要的。

然而,它仍然开放,是否有任何迹象表明像std::is_pointer这样的特征将是类似简化的一部分除了std::is_pointer<T>()-版本?

是的。目前在DTS投票中的第一个库基础TS添加了许多_v变量模板。例如:

template <class T> constexpr bool is_pointer_v
  = is_pointer<T>::value;

就像TS中添加的所有内容一样,它位于std::experimental命名空间中。它们已经在libstdc++和libc++的主干版本中实现。

相关文章: