std :: enable_if如何工作? [英] How Does std::enable_if work?

查看:83
本文介绍了std :: enable_if如何工作?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我刚刚问了一个问题: std :: numeric_limits作为条件

I just asked this question: std::numeric_limits as a Condition

我了解 std :: enable_if 将有条件地定义方法的返回类型的用法,导致该方法无法执行

I understand the usage where std::enable_if will define the return type of a method conditionally causing the method to fail to compile.

template<typename T>
typename std::enable_if<std::numeric_limits<T>::is_integer, void>::type foo(const T &bar) { isInt(bar); }

我不明白的是第二个论点和对<$ c $的看似毫无意义的赋值c> std :: enable_if 作为模板语句的一部分声明时,例如 Rapptz 答案

What I don't understand is the second argument and the seemingly meaningless assignment to std::enable_if when it's declared as part of the template statement, as in Rapptz answer.

template<typename T, typename std::enable_if<std::is_integral<T>::value, int>::type = 0>
void foo(const T& bar) { isInt(); }


推荐答案

正如40two ,对替换失败不是错误是理解 std :: enable_if 的先决条件。

As is mentioned in comment by 40two, understanding of Substitution Failure Is Not An Error is a prerequisite for understanding std::enable_if.

std :: enable_if 是一个专用模板,定义为:

std::enable_if is a specialized template defined as:

template<bool Cond, class T = void> struct enable_if {};
template<class T> struct enable_if<true, T> { typedef T type; };

此处的关键在于 typedef T type bool Cond true 时定义$ c。

The key here is in the fact that typedef T type is only defined when bool Cond is true.

现在有了对 std :: enable_if 的理解,很明显 void foo(const T& bar){isInt(bar); } 的定义如下:

Now armed with that understanding of std::enable_if it's clear that void foo(const T &bar) { isInt(bar); } is defined by:

template<typename T>
typename std::enable_if<std::numeric_limits<T>::is_integer, void>::type foo(const T &bar) { isInt(bar); }

firda的答案 = 0 是第二个模板参数的默认值。 template< typename T,typename std :: enable_if< std :: is_integral< T> :: value,int> :: type = 0> 默认的原因是这样两个选项都可以使用 foo< int>(1); 。如果未默认 std :: enable_if 模板参数,则调用 foo 将需要两个模板参数,而不仅仅是 int

As mentioned in firda's answer, the = 0 is a defaulting of the second template parameter. The reason for the defaulting in template<typename T, typename std::enable_if<std::is_integral<T>::value, int>::type = 0> is so that both options can be called with foo< int >( 1 );. If the std::enable_if template parameter was not defaulted, calling foo would require two template parameters, not just the int.

一般说明,通过显式使此答案更清晰输入 typename std :: enable_if< std :: numeric_limits< T> :: is_integer,void> :: type void std :: enable_if 的默认第二个参数,如果您具有 enable_if_t 是已定义的类型,应使用。因此,返回类型应压缩为: std :: enable_if_t< std :: numeric_limits< T> :: is_integer>

General note, this answer is made clearer by explicitly typing out typename std::enable_if<std::numeric_limits<T>::is_integer, void>::type but void is the default second parameter to std::enable_if, and if you have c++14 enable_if_t is a defined type and should be used. So the return type should condense to: std::enable_if_t<std::numeric_limits<T>::is_integer>

针对visual-studio 视觉-studio-2013 :不支持默认模板参数,因此您只能在函数返回值上使用 enable_if std::numeric_limits作为条件

A special note for users of visual-studio prior to visual-studio-2013: Default template parameters aren't supported, so you'll only be able to use the enable_if on the function return: std::numeric_limits as a Condition

这篇关于std :: enable_if如何工作?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆