为什么C++ 11类型特征不是别名模板?

Kon*_*lph 23 c++ templates type-traits template-meta-programming c++11

类似的问题:为什么type_traits用专门的模板结构而不是constexpr实现? - 但答案不同.

我意识到别名模板不能专门化,因此目前无法直接用于实现类型特征1.然而,这是委员会的一个有意识的决定,据我所知,没有技术理由禁止这样做.

那么将类型特征实现为别名模板,简化它们的语法会不会更有意义?

考虑

 typename enable_if<is_pointer<T>::value, size_t>::type
 address(T p);
Run Code Online (Sandbox Code Playgroud)

 enable_if<is_pointer<T>, size_t> address(T p);
Run Code Online (Sandbox Code Playgroud)

当然,这从Boost.TypeTraits移动时引入了一个突破性的界面变化- 但这真的是一个大问题吗?

毕竟,无论如何都需要修改代码,因为类型驻留在不同的命名空间中,并且由于许多现代C++程序员不愿意打开命名空间,因此将明确限定(如果它将被更改).

另一方面,它极大地简化了代码.鉴于模板元编程经常被深深嵌套,复杂和复杂,显然更清晰的界面是有益的.

我错过了什么吗?如果没有,我会欣赏一个不仅仅是猜测的答案,而是依赖(并且可以引用)对委员会决策理由的了解.


1间接非常好!考虑:

template <typename T> using is_pointer = typename meta::is_pointer<T>::type;
Run Code Online (Sandbox Code Playgroud)

其中meta::is_pointer<T>对应当前std::is_pointer<T>类型.

How*_*ant 16

你问题最具体的答案是:没有人提议这样做.

C++标准委员会是一个多国家,多公司的志愿者集合.您将其视为单个组织内的设计委员会.如果没有提案将标准纳入标准草案,C++标准委员会就无法做任何事情.

我想,没有提议的原因是类型特征是一个早期的提议,其推动实现可以追溯到2000年左右.模板别名在实施后期较晚.许多委员会成员不愿提出他们尚未实施的内容.实施提案的机会很少.

运送C++ 11有很大的压力.它真的打算在2009年发货,当这个发货日期下滑时,除了修正已经考虑的功能之外,对工作文件做任何事情都非常困难.在某些时候,你必须把好的新想法放在后面,以免你永远不会发货.

更新

从C++ 14开始,TransformationTraits(导致类型的那些)现在具有模板别名拼写,例如:

template <bool b, class T = void>
  using enable_if_t = typename enable_if<b,T>::type;
Run Code Online (Sandbox Code Playgroud)

而C++ 1z工作草案现在具有导致值的特征的模板变量拼写:

template <class T>
  constexpr bool is_pointer_v = is_pointer<T>::value;
Run Code Online (Sandbox Code Playgroud)

此外,即使在C++ 11中,也可以:

typename enable_if<is_pointer<T>{}, size_t>::type
address(T p);
Run Code Online (Sandbox Code Playgroud)

即你可以{}代替使用::value(假设你的编译器有constexpr支持).在C++ 14中变为:

enable_if_t<is_pointer<T>{}, size_t>
address(T p);
Run Code Online (Sandbox Code Playgroud)

在C++ 1z中:

enable_if_t<is_pointer_v<T>, size_t>
address(T p);
Run Code Online (Sandbox Code Playgroud)

需要注意的是C++ 1Z和C++ 14之间的差异微乎其微的,它甚至不保存字符,只是改变{}_v和你把这两个字符的变化.

  • 让我重新说一下:**你**没有提议.因此,我们从未审核过您的提案 你只能责怪自己.;-) (5认同)