gpt4 book ai didi

c++ - std::enable_if 是如何工作的?

转载 作者:IT老高 更新时间:2023-10-28 21:45:18 27 4
gpt4 key购买 nike

我刚刚问了这个问题:std::numeric_limits as a Condition

我了解 std::enable_if 将定义方法的返回类型的用法,有条件地导致方法编译失败。

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

我不明白的是第二个参数以及当 std::enable_if 声明为模板语句的一部分时看似毫无意义的赋值,如 Rapptz answer .

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

最佳答案

正如 40two 评论中提到的那样,了解Substitution Failure Is Not An Error是理解的前提std::enable_if .

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

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 .

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

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

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


一般注意,通过明确输入 typename std::enable_if<std::numeric_limits<T>::is_integer, void>::type 可以更清楚地说明这个答案但是 voidstd::enable_if 的默认第二个参数, 如果你有 enable_if_t是一个定义的类型,应该使用。所以返回类型应该压缩为:std::enable_if_t<std::numeric_limits<T>::is_integer>

用户的特别说明之前 : 不支持默认模板参数,因此您只能使用 enable_if函数返回:std::numeric_limits as a Condition

关于c++ - std::enable_if 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25284499/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com