C++14 使用 is_same::value 的别名
C++14 using alias for is_same::value
使用 is_same<uint64_t, decltype(val)>::value
.
我希望有一个 C++14 using alias
: is_same_v
类似于辅助类型:conditional_t
、enable_if_t
和 tuple_element_t
我在 中使用它。因为我使用这些函数中的任何一个的唯一目的就是获取 type
。所以 *_t
助手才有意义。
这让我想到了我的问题,为什么 C++14 中没有 using alias is_same_v
?我唯一使用 is_same
的是 value
。也许 is_same
的用法通常不用于模板声明?
我想说引入 _t
助手的主要原因是为了摆脱在任何地方都放置 typename
的需要。当您在模板上下文中使用 conditional
或 tuple_element
等类型特征时,它依赖于模板参数(这是 非常 的常见用法例),你必须在结构 std::conditional<X, Y, Z>::type
前加上 typename
。您不必使用 _t
助手来执行此操作,因为它们没有嵌套在依赖于模板参数的内容中。
您不必为 std::is_same<X, Y>::value
添加任何此类前缀,因为成员 value
不是类型。
其次,您将如何为 value 引入助手 type?你能做的最好的就是一个变量模板。因为它只会节省输入 ::value
,而不是 typename /*...*/ ::type
,所以它可能被认为是不必要的。
简介
引入 std::enable_if_t<cond, T>
作为 std::enable_if<cond, T>::type
的缩写形式的主要原因不是为了削减 4 个字符。
由于 std::enable_if
和其他 type-traits 主要用于依赖上下文,因此不得不编写 非常痛苦(A) 当 (B) 就足够了:
例子
template<class T, class = typename std::enable_if<cond, T>::type> // (A)
struct A;
template<class T, class = std::enable_if_t<cond, T>> // (B)
struct A;
相关名称
我们需要 typename 在 std::enable_if
之前,因为 ::type
是 dependent-name,没有它标准说表达式应该被解析为好像 ::type
实际上是一个 value.
std::is_same<T, U>::value
实际上是一个值,所以没有必要使用typename;这反过来意味着我们实际上只削减了 4 个字符.. 仅此而已。
进一步阅读
- whosebug.com - Where and why do I have to put the template and typename keywords?
那么,为什么std::is_same没有变量模板?
只是因为没有那么大的需求,所以没有人及时提出添加;因为 大多数 对以下备选方案感到满意:
std::is_same<T, U> {} == std::is_same<T, U>::value
std::is_same<T, U> () == std::is_same<T, U>::value
进一步阅读
有一个 proposal,由 Stephan T. Lavavej 编写,用于为合适的 type-traits[=80] 添加变量模板=].
is_same_v
(以及其他 *_v
类型特征)已由 N3854. They didn't make into C++14 but they are in the Library Fundamentals TS 提出。
其中一个问题是与 Concepts Proposal which might offer a better alternative for type traits (and many other current meta-programming techniques). An outdated but clearer explanation of Concepts can be found here 的潜在重叠。
is_same<uint64_t, decltype(val)>::value
.
我希望有一个 C++14 using alias
: is_same_v
类似于辅助类型:conditional_t
、enable_if_t
和 tuple_element_t
我在 type
。所以 *_t
助手才有意义。
这让我想到了我的问题,为什么 C++14 中没有 using alias is_same_v
?我唯一使用 is_same
的是 value
。也许 is_same
的用法通常不用于模板声明?
我想说引入 _t
助手的主要原因是为了摆脱在任何地方都放置 typename
的需要。当您在模板上下文中使用 conditional
或 tuple_element
等类型特征时,它依赖于模板参数(这是 非常 的常见用法例),你必须在结构 std::conditional<X, Y, Z>::type
前加上 typename
。您不必使用 _t
助手来执行此操作,因为它们没有嵌套在依赖于模板参数的内容中。
您不必为 std::is_same<X, Y>::value
添加任何此类前缀,因为成员 value
不是类型。
其次,您将如何为 value 引入助手 type?你能做的最好的就是一个变量模板。因为它只会节省输入 ::value
,而不是 typename /*...*/ ::type
,所以它可能被认为是不必要的。
简介
引入 std::enable_if_t<cond, T>
作为 std::enable_if<cond, T>::type
的缩写形式的主要原因不是为了削减 4 个字符。
由于 std::enable_if
和其他 type-traits 主要用于依赖上下文,因此不得不编写 非常痛苦(A) 当 (B) 就足够了:
例子
template<class T, class = typename std::enable_if<cond, T>::type> // (A)
struct A;
template<class T, class = std::enable_if_t<cond, T>> // (B)
struct A;
相关名称
我们需要 typename 在 std::enable_if
之前,因为 ::type
是 dependent-name,没有它标准说表达式应该被解析为好像 ::type
实际上是一个 value.
std::is_same<T, U>::value
实际上是一个值,所以没有必要使用typename;这反过来意味着我们实际上只削减了 4 个字符.. 仅此而已。
进一步阅读
- whosebug.com - Where and why do I have to put the template and typename keywords?
那么,为什么std::is_same没有变量模板?
只是因为没有那么大的需求,所以没有人及时提出添加;因为 大多数 对以下备选方案感到满意:
std::is_same<T, U> {} == std::is_same<T, U>::value
std::is_same<T, U> () == std::is_same<T, U>::value
进一步阅读
有一个 proposal,由 Stephan T. Lavavej 编写,用于为合适的 type-traits[=80] 添加变量模板=].
is_same_v
(以及其他 *_v
类型特征)已由 N3854. They didn't make into C++14 but they are in the Library Fundamentals TS 提出。
其中一个问题是与 Concepts Proposal which might offer a better alternative for type traits (and many other current meta-programming techniques). An outdated but clearer explanation of Concepts can be found here 的潜在重叠。