【发布时间】:2013-12-16 07:55:56
【问题描述】:
在查看 C++14 元函数别名提案 (TransformationTraits Redux, v2,N3655) 时,我注意到,不仅类型到类型的转换(例如 add_const),类型到值的元函数(例如 @ 987654325@ ) 也是类型别名。 (N3797 中不存在)。
别名类型对值元函数有什么好处吗?我认为,当存在转换操作时,可以在没有这些别名的情况下使用它们,例如 enable_if_t<is_void<T>::value,T> 或 enable_if_t<is_void<T>{}(),T>。 (我猜is_void<T>::type::value 和is_void<T>::value 一样)
如果值元函数的类型需要是别名,将它们别名为变量模板会更好吗(我没有 C++14 编译器并且从未使用过变量模板。所以语法可能是错误的)?例如别名is_void为
template <class T>
constexpr bool is_void_t = is_void<T>::value;
代替
template <class T>
using is_void_t = typename is_void<T>::type;
那么就可以写enable_if_t<is_void_t<T>,T>不用boost风格enable_if,写表达会更容易(例如enable_if_t<(is_void_t<T> || is_integral_t<T>),T>
【问题讨论】:
-
“我没有 C++14 编译器”-coliru.stacked-crooked.com
-
@chris gcc 4.8 是否支持可变模板?看起来 gcc svn trunk 对它有一些支持。 clang 似乎也在他们的后备箱中支持它。你知道任何在线编译器有最新的 c++14 快照来测试吗?
-
Coliru 使用 SVN 版本的 Clang。
-
我刚刚测试过,但 Coliru 的 Clang 3.4 (trunk 184460) 似乎不支持变量模板。
-
这很奇怪,特别是考虑到标记为 SVN 的其他功能(如返回类型推导)确实有效。
标签: c++ typetraits c++14 template-aliases variable-templates