【发布时间】:2012-03-18 21:34:32
【问题描述】:
类似问题:Why are
type_traitsimplemented with specialized template structs instead of constexpr?——但答案不同。
我知道alias templates cannot be specialised 因此目前不能直接用于实现类型特征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> 类型。
【问题讨论】:
-
"
is_pointer<T>" - 您的enable_if别名是否将类型作为第一个参数? :) -
@Xeo:不,但是特征类有一个
constexpr隐式转换运算符。 :) -
@GMan:模板参数没有隐式转换。 :P 另外,它们是类型。类型不能隐式转换为任何东西!
-
@wilhelmtell 说真的!?除了这个例子清楚地表明它更简短,样板更少?这是一个简单的例子。我见过并使用过很多(!)更复杂的嵌套模板元编程结构。你几乎将垃圾的数量减少了一半。这是一个巨大的改进。
-
旁注:C++14 将添加
enable_if_t和其他类似的别名。见en.cppreference.com/w/cpp/types/enable_if。一些编译器已经支持这一点。但是,它们具有不同的名称 (_t),因此它们不会破坏现有代码。
标签: c++ templates c++11 template-meta-programming typetraits