在C++14中,可以将类型到值元函数用作变量别名

Can type to value meta-function be used as variable alias in C++14?

本文关键字:函数 别名 变量 类型 C++14      更新时间:2023-10-16

在查看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;

这样就可以在没有boost风格的enable_if的情况下编写enable_if_t<is_void_t<T>,T>,并且编写表达式会更容易(例如enable_if_t<(is_void_t<T> || is_integral_t<T>),T>

"别名类型对值元函数有任何好处吗?"

引用链接的N3655,在is_void_t和同级规范之前(第4页):

4;补充拟议措辞

以下措辞是为了响应LWG的请求而提供的,即为所有类型特征一致地提供::type成员的别名,而不仅仅是那些被归类为TransformationTraits的成员。因此,本节提供了完成该套所需的规范。

这就解释了为什么"类型到值元函数(如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>的东西。但我觉得值别名比类型别名"不那么需要":它不会节省太多的键入,而且,正如您所说,您可以使用具有相同效果的短is_void<T>{}()(对于C++11,is_void<T>{}通常就足够了,这要归功于它的operator bool())。