9

本题使用is_same<uint64_t, decltype(val)>::value.

我预计会有一个 C++14 using alias:is_same_v类似于 helper types: conditional_t, enable_if_t, 并且tuple_element_t我在我的答案中使用它。因为我使用这些功能的唯一目的就是获取type. 所以这个*_t助手是有道理的。

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

4

3 回答 3

8

介绍

std::enable_if_t<cond, T>引入较短形式的主要原因std::enable_if<cond, T>::type是不要仅仅计算4 个字符。

由于std::enable_if和其他同类类型特征主要用于依赖上下文中,因此当(B)就足够了时,不得不编写(A)是非常痛苦的:

例子

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它是一个从属名称,如果没有它,标准规定表达式应该被解析为好像::type实际上是一个

std::is_same<T, U>::value确实是一个,所以不需要使用typename;这反过来意味着我们实际上只剃掉了 4 个字符……仅此而已。


延伸阅读



那么,为什么没有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

延伸阅读

有一个提案,由Stephan T. Lavavej编写,为合适的type-traits添加变量模板。

于 2015-03-09T12:39:16.347 回答
7

is_same_v(和其他*_v类型特征)已由N3854提出。他们没有进入 C++14,但他们在Library Fundamentals TS中。

其中一个担忧是与概念提案的潜在重叠,这可能为类型特征(以及许多其他当前的元编程技术)提供更好的替代方案。可以在此处找到对概念的过时但更清晰的解释。

于 2015-03-09T17:44:07.033 回答
4

我会说引入助手的主要原因_t是摆脱typename到处放置的需要。当您在模板的上下文中使用类型特征时conditionaltuple_element它依赖于模板参数(这是一个非常常见的用例),您必须在构造前std::conditional<X, Y, Z>::type加上typename. 您不必对_t助手执行此操作,因为它们没有嵌套在依赖于模板参数的东西中。

您不必为 添加任何此类前缀std::is_same<X, Y>::value,因为成员value不是类型。

其次,无论如何,您将如何为引入辅助类型?你能做的最好的就是一个变量模板。由于它只会节省打字,而不是,它可能被认为是不必要的。::valuetypename /*...*/ ::type

于 2015-03-09T12:24:18.703 回答