gpt4 book ai didi

c++ - 具有类默认值的模板参数

转载 作者:搜寻专家 更新时间:2023-10-31 01:35:51 28 4
gpt4 key购买 nike

我不太明白下面的代码,模板有两个参数,第二个是class = xxxx,这让我觉得很奇怪。你能给我解释一下我应该怎么理解吗?除了 std::enable_if 之外,这个 C++ 特性还有其他用例吗?

template < class T,
class = typename std::enable_if<std::is_integral<T>::value>::type>
bool is_even (T i) {return !bool(i%2);}

最佳答案

一个词:SFINAE。

替换失败不是错误。

用 google 搜索这个词,一个全新的世界将为您打开。

让我们看看您的代码的含义。

std::is_integral<typename T>::value

它是一个 bool 值,依赖于T类型,如果T是整数类型,则值为truefalse否则。

std::enable_if<bool B, typename T = void>::type

它是类型 T,当 B == true 时,没有别的。

所以,在你的代码中

template < class T,
class = typename std::enable_if<std::is_integral<T>::value>::type>

T 是整数类型时,第二个(未命名的)模板参数被替换为一个类型(默认值:void;但是,在这种情况下,确切的类型无关)并且功能被激活。相反,当 T 不是整数类型时,第二个模板参数的替换失败,并且此版本的 is_even() 函数不是' t 激活(对于 T 类型)并且,这是重要的一点,它不是错误(可以激活另一个版本的 is_even())。

更有趣的是如何为非整数类型实现 is_even() 的替代版本。你可以认为你可以实现另一个否定 std::is_integral

的版本
template < class T,
class = typename std::enable_if<false == std::is_integral<T>::value>::type>

但这不起作用(是一个错误并且不编译)因为你有两个 is_even() 模板化函数,它们(从模板参数的角度来看)仅在默认情况下不同争论。

一个解决方案可以将SFINAE应用于返回值

#include <type_traits>
#include <iostream>

template <typename T>
typename std::enable_if<true == std::is_integral<T>::value, bool>::type
is_even (T const & i)
{ return ! (i%2); }

template <typename T>
typename std::enable_if<false == std::is_integral<T>::value, bool>::type
is_even (T const &)
{ return false; }


int main()
{
std::cout << "-- is 7 even ? " << is_even(7) << '\n';
std::cout << "-- is 8UL even ? " << is_even(8LL) << '\n';
std::cout << "-- is \"abc\" even ? " << is_even("abc") << '\n';

return 0;
}

通过这种方式,您可以为整数类型启用 is_even() 版本,为非整数类型启用第二个版本(甚至返回 false)。

p.s.:抱歉我的英语不好。

关于c++ - 具有类默认值的模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36635826/

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