可以在C ++ 14中使用类型值元函数作为变量别名吗?

时间:2013-11-30 06:22:47

标签: c++ typetraits c++14 template-aliases variable-templates

在查看C ++ 14的元函数别名提案(TransformationTraits Redux, v2,N3655)时,我注意到,不仅键入转换类型(例如add_const),键入元函数值(例如is_void)也是类型别名。 (N3797中没有)。

别名类型对元函数的值是否有任何优势?我认为,当转换操作存在时,可以在没有这些别名的情况下使用它们,例如enable_if_t<is_void<T>::value,T>enable_if_t<is_void<T>{}(),T>。 (我猜is_void<T>::type::valueis_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>的情况下编写enable_if,并且撰写表达式会更容易(例如enable_if_t<(is_void_t<T> || is_integral_t<T>),T>

1 个答案:

答案 0 :(得分:4)

“别名类型对元函数的值是否有任何优势?”

is_void_t和兄弟姐妹(第4页)的规格之前,从链接的N3655引用:

  

4补充提议的措辞

     

提供以下措辞是为了回应LWG的要求,即为所有类型特征始终提供 ::type 成员的别名,而不仅仅是那些归类为 TransformationTraits的 I>。因此,本节提供了完成设置所需的规范。

这解释了为什么“类型到值的元函数(例如is_void)在提案中也是类型别名”:为了保持一致。

此外,将名称“is_void_t”用于别名is_void<T>::value是错误的。 “_t”后缀始终表示类型。对于该值,也许可以使用“ _v ”后缀。那么我们就会有两个:

template <class T>
using is_void_t = typename is_void<T>::type;

template <class T>
constexpr bool is_void_v = is_void<T>::value;

那应该在C ++ 14中编译,然后你可以编写像enable_if_t<(is_void_v<T> || is_integral_v<T>),T>这样的东西。但是我觉得值别名“不太需要”而不是类型1:它不会节省多少打字,而且,如你所说,你可以使用具有相同效果的短is_void<T>{}()(和C一样) ++ 11,is_void<T>{}通常就足够了,感谢operator bool()}。