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_tenable_if_ttuple_element_t我在 中使用它。因为我使用这些函数中的任何一个的唯一目的就是获取 type。所以 *_t 助手才有意义。

这让我想到了我的问题,为什么 C++14 中没有 using alias is_same_v?我唯一使用 is_same 的是 value。也许 is_same 的用法通常不用于模板声明?

我想说引入 _t 助手的主要原因是为了摆脱在任何地方都放置 typename 的需要。当您在模板上下文中使用 conditionaltuple_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;


相关名称

我们需要 typenamestd::enable_if 之前,因为 ::typedependent-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 的潜在重叠。