gpt4 book ai didi

c++ - (部分)bool 的模板特化

转载 作者:行者123 更新时间:2023-11-28 04:55:59 25 4
gpt4 key购买 nike

我正在努力理解 bool 的模板特化如何适用于这张取自 cppcon 2017 的幻灯片。

简短的问题:为什么(第一个)主模板处理 奇数 N 个案例,而它的签名是

<..., bool = (N % 2 == 0)> ?

为了了解自己,我简化为

#include<iostream>
template<unsigned N, bool =(N%2==0)> struct S { void operator()(){ std::cout << "A\n"; } };
template<unsigned N> struct S<N, true> { void operator()(){ std::cout << "B\n"; } };
int main()
{
S<2>{}();
S<3>{}();
}

打印 B A,显示与链接谈话相同(但对我来说很神秘)的行为,但如果我将模板特化更改为

template<unsigned N> struct S<N, false> { void operator()(){ std::cout << "B\n"; } };
-----

它打印 A B:编译器如何在主要 S 及其特化之间进行选择?

最佳答案

编译器总是更喜欢特化而不是泛化,因此如果可以的话总是会选择它。

结构S有一个部分模板特化,只有在第二个模板参数计算为 true 时才会被选择,让我们看看它是如何工作的:

S<2>{}();

这里是模板参数N是 2 所以 2 % 2 == 0成立。这意味着将选择特化而不是通用化 S因为特化要求第二个参数是 trueB打印出来。

S<3>{}(); 不是这种情况因为3 % 2 == 0为假,因此使用一般情况,给你 A .

如果你交换它并使特化只接受 false对于 N % 2 == 0那么结果将完全相反,2 % 2 == 0仍然成立,但特化只接受假所以它没有被选中,3 % 2 == 0为假,因此将被选中,导致 A B .

关于c++ - (部分)bool 的模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47124357/

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