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和你把这两个字符的变化.
| 归档时间: |
|
| 查看次数: |
3433 次 |
| 最近记录: |