为什么所有type_traits类都必须使用 'typename' 和'::type'前缀/后缀调用?
Why do all type_traits Classes have to be called using 'typename' and '::type' Prefix/Suffix?
这是一个奇怪的问题,尽管它很明显:
为什么<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++的主干版本中实现。
- 使用 [] 运算符时"binding reference of type discards qualifiers"
- 在 QVector<std::unique_ptr 上使用 std::find<Type>>
- 为什么返回类型中需要typename?C++
- 在类型和包装器之间reinterpret_cast是否安全<Type>?
- 使用 cmake 的 Linux 终端上的"Conversion to non-scalar type is requested"错误
- 控制到达非空函数clang(-Wreturn-type)的末尾
- std::unordered_map 类型对象声明期间出现"field has incomplete type"错误
- 将系数存储在头文件的数组中("does not name a type"错误)
- C++ assigment std::list:<typename>:itrator 在 main 中工作,但在方法中它不起作用
- 尝试打开 ifstream 时出现"Incomplete type"错误
- 使用 'typename' 关键字将非类型视为依赖上下文中的类型
- 将成员函数作为构造函数参数调用时出错 "Variable is not a type name"
- 在"结构提升::enable_if<提升::is_pod<T>,无效>"中没有名为"type"的类型
- "Missing type specifier - int assumed"无法通过向主函数添加"return 0"来解决
- "Cannot convert Python object argument to type '<typename>'" - 使用 Cython 包装 C++ 类时出错
- 为什么所有type_traits类都必须使用 'typename' 和'::type'前缀/后缀调用?
- 使用 xerces 读取 XML:获取类型,其中 <nodeName type= "typeName" >
- 在"std::result_of<_Signature>::type"之前需要"typename",因为"std::result_of<_Signature>"是一个依赖范围
- 对于类型修改特征,我是否应该为 typename::transform<...>::type 提供一个模板 typedef(又名使用)方便包装器?
- "#define TYPE(x) typename decltype(x)"是个坏主意吗?