C++ 14使用is_same :: value的别名

Jon*_*Mee 9 c++ templates helper c++14 c++17

这个问题用了is_same<uint64_t, decltype(val)>::value.

我希望那里是一个C++ 14 using alias:is_same_v类似于助手类型:conditional_t,enable_if_t,和tuple_element_t我在用我的答案.因为我唯一能使用这些功能的是获得type.所以*_t助手才有意义.

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

Fil*_*efp 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;
Run Code Online (Sandbox Code Playgroud)

template<class T, class = std::enable_if_t<cond, T>>              // (B)
struct A;
Run Code Online (Sandbox Code Playgroud)

从属名称

我们之前需要typenamestd::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
Run Code Online (Sandbox Code Playgroud)


进一步阅读

Stephan T. Lavavej撰写了一个建议,为适当的类型特征添加变量模板.

  • 请注意,is_same &lt;T,U&gt; {}`只能通过隐式转换来执行std :: is_same &lt;T,U&gt; :: value` ==`。相比之下,“ is_same &lt;T,U&gt; {}()`”实际上是“ bool”类型的。 (2认同)

Cas*_*eri 7

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

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