在C++14中,可以将类型到值元函数用作变量别名
Can type to value meta-function be used as variable alias in C++14?
在查看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::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;
这样就可以在没有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()
)。
- 使用定义函数模板别名
- 如何同时别名和实例化模板函数?
- 通过类型别名从构造函数转发模板推导
- typedef 别名的析构函数
- 函数的返回值类型是别名 ***或 *** 布尔值
- std::shared_ptr 使用别名构造函数,是否可以检索初始指针值?
- 使用其他模板类型参数作为要在函数签名中使用的类型别名声明
- 在模板派生类中继承具有类型别名的构造函数
- 模板类函数指针类型别名
- 使用函数数据类型键入别名和别名模板
- 是否可以为模板类的模板函数成员设置别名?
- 类方法和全局函数中的别名
- 别名一个模板函数,该功能没有参数可更简洁
- MSVC:带函数的"error C2244: unable to match function definition to an existing declaration"是指专用模板类的类型别名
- Cython 创建 C 函数别名
- 需要有关函数别名的帮助
- 函数别名,适用于头文件
- 创建函数别名
- C++11 模板函数别名与包装器
- C++模板函数别名为可变参数模板参数