类似的问题:为什么
type_traits
用专门的模板结构而不是 constexpr 来实现?——但有不同的答案。
我意识到别名模板不能专门化,因此目前不能直接用于实现类型特征1。然而,这是委员会有意识的决定,据我所知,没有技术上的理由禁止这样做。
那么将类型特征实现为别名模板并简化它们的语法不是更有意义吗?
考虑
typename enable_if<is_pointer<T>::value, size_t>::type
address(T p);
相对
enable_if<is_pointer<T>, size_t> address(T p);
当然,这在从Boost.TypeTraits迁移时引入了一个重大的界面变化——但这真的是一个大问题吗?
毕竟,代码无论如何都需要修改,因为类型驻留在不同的命名空间中,并且由于许多现代 C++ 程序员不愿意打开命名空间,因此将明确限定(如果它会被更改的话)。
另一方面,它极大地简化了代码。鉴于模板元编程经常变得嵌套、复杂和复杂,显然更清晰的界面是有益的。
我错过了什么吗?如果不是,我会很感激一个不仅仅是猜测的答案,而是依赖于(并且可以引用)委员会决策理由的知识。
1但间接地很好!考虑:
template <typename T> using is_pointer = typename meta::is_pointer<T>::type;
其中meta::is_pointer<T>
对应于当前std::is_pointer<T>
类型。