gpt4 book ai didi

c++ - 了解如何在编译时计算总和

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:29:39 25 4
gpt4 key购买 nike

我有这段代码,想了解一下:

template <unsigned...>
struct sum;

template<unsigned size>
struct sum<size>
{
enum {value = size};
};

template<unsigned size, unsigned... sizes>
struct sum<size, sizes...>
{
enum { value = size + sum<sizes...>::value };
};

int _tmain(int argc, _TCHAR* argv[])
{
sum<1, 2>::value;
return 0;
}

我不明白为什么必须存在未实现的总和(采用无符号...就像最后一个结构特化,没有冲突吗?)以及如何使用模板部分的相同参数来特化总和( e.g. sum<size, sizes...>template <unsigned size, sizes...> 相同。为什么波纹管不起作用?

template<unsigned size>
struct sum
{
enum {value = size};
};

template<unsigned size, unsigned... sizes>
struct sum
{
enum { value = size + sum<sizes...>::value; };
};

最佳答案

注意语法有点不同。声明主模板时:

template <unsigned...>
struct sum;

您不要在sum 之后给出模板参数。这是因为您正在创建一个全新的模板,并说它采用任意数量的无符号整数作为参数。

当你这样做的时候:

template<unsigned size, unsigned... sizes>
struct sum<size, sizes...>
{
enum { value = size + sum<sizes...>::value };
};

您正在特化您之前声明的模板。您是说,如果您的参数由一个无符号值和后跟任意数量的其他无符号值组成,请使用此定义。这与主模板不完全相同。主模板包括零参数的可能性。

当您尝试这样做时:

template<unsigned size>
struct sum
{
enum { value = size };
};

template<unsigned size, unsigned... sizes>
struct sum // OOPS! A template called `sum` has already been declared!
{
enum { value = size + sum<sizes...>::value };
};

您正试图制作两个具有相同名称的不同类模板,这是不允许的。

请注意,这与函数模板的工作方式略有不同。使用函数模板,您可以进行重载,因此拥有多个具有相同名称的函数模板是可以的。但是,对于函数模板,您不能进行部分特化,因为这会产生很多歧义。

您可能认为主模板和特化之间存在歧义,但更特化的特化总是优先于不太特化的特化,并且主模板始终可以被认为是最不特化的。如果这不是真的,那么偏特化就根本行不通。

关于c++ - 了解如何在编译时计算总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18676418/

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