C++ 压缩变量模板具有零元素时的递归

C++ 压缩变量模板具有零元素时的递归,c++,c++11,variadic-templates,C++,C++11,Variadic Templates,我有一门课是这样的: template<std::size_t T, std::size_t... Args> class A{ public: std::array<int,summation<Args...>::value> x; } 问题是,当Args为空时(即,我只指定T模板),基本情况不起作用,我会收到一条编译错误消息: error: wrong number of template arguments (0, should be

我有一门课是这样的:

template<std::size_t T, std::size_t... Args>
class A{
   public:
      std::array<int,summation<Args...>::value> x;
}
问题是,当Args为空时(即,我只指定
T
模板),基本情况不起作用,我会收到一条编译错误消息:

error: wrong number of template arguments (0, should be 1 or more)
sizeof…(Args)==0时,如何修改
求和的递归
以正确处理这种情况,并在这种情况下为求和返回值0?我正在使用C++11。谢谢


注意:我还希望它在多线程环境中工作,在这种环境中,具有不同参数的不同线程可以同时调用求和。要在多线程环境中工作,需要进行哪些更改?谢谢

声明应该是最通用的声明,然后您可以部分地专门处理可能的情况。以下解决方案有效:

模板
结构求和;
模板
结构求和
{
静态常数std::size\u t value=大小+总和::值;
};
模板
结构求和{
静态常数std::size\u t值=0;
};
std::size\u t foo(){
返回总和::值;
}
std::size\u t foo2(){
返回总和::值;
}

声明应该是最通用的声明,然后您可以部分地专门处理可能的情况。以下解决方案有效:

模板
结构求和;
模板
结构求和
{
静态常数std::size\u t value=大小+总和::值;
};
模板
结构求和{
静态常数std::size\u t值=0;
};
std::size\u t foo(){
返回总和::值;
}
std::size\u t foo2(){
返回总和::值;
}
此代码:

size + summation<sizes...>::value;
size+summation::value;
翻译

summation<1,2,3,4>::value
求和::值
进入

1+求和::值;//修剪出第一个参数;匹配可变版本
2+总和::值;//再次修剪第一个参数;匹配可变版本
3+总和::值;//匹配版本。到目前为止,您都支持签名
4+总和::值;//代码中缺少求和定义!!
这里有更详细的解释

此代码:

size + summation<sizes...>::value;
size+summation::value;
翻译

summation<1,2,3,4>::value
求和::值 进入

1+求和::值;//修剪出第一个参数;匹配可变版本
2+总和::值;//再次修剪第一个参数;匹配可变版本
3+总和::值;//匹配版本。到目前为止,您都支持签名
4+总和::值;//代码中缺少求和定义!!

这里有更详细的解释

它能用,谢谢。不过,我不明白为何需要申报。如果没有声明(前两行),我会得到一个编译错误:“summation不是类模板结构summation”,但是。。。添加零尺寸的专门化,只有一个尺寸的专门化变得多余:你可以删除它,他的作品由一个或多个尺寸的专门化制作。另一个建议是:将问题标记为C++11,以便您可以定义
constepr
,而不是简单地定义
s@astrophobia-是必需的,因为您最初使用一个或多个大小定义了一个求和,并且主版本管理多个大小写,其中专门化只管理一个大小写。现在,在Balki的解决方案中,
求和
管理零或更多大小(因为您要求零大小写);因此,一个或多个不能再成为主要案例(不能管理零案例),Balki将其作为一种专门化编写。现在您有三个专门化(一个或多个,正好一个和正好零个大小),但没有定义。前两行现在是定义(没有实现)。@max66谢谢。更新。是的,一个大小是多余的。但是,如果代码是多线程的,并且我们试图并行计算多个求和,该怎么办?这还能用吗?我注意到在这个解决方案中使用了许多静态变量,这非常有效。不过,我不明白为何需要申报。如果没有声明(前两行),我会得到一个编译错误:“summation不是类模板结构summation”,但是。。。添加零尺寸的专门化,只有一个尺寸的专门化变得多余:你可以删除它,他的作品由一个或多个尺寸的专门化制作。另一个建议是:将问题标记为C++11,以便您可以定义
constepr
,而不是简单地定义
s@astrophobia-是必需的,因为您最初使用一个或多个大小定义了一个求和,并且主版本管理多个大小写,其中专门化只管理一个大小写。现在,在Balki的解决方案中,
求和
管理零或更多大小(因为您要求零大小写);因此,一个或多个不能再成为主要案例(不能管理零案例),Balki将其作为一种专门化编写。现在您有三个专门化(一个或多个,正好一个和正好零个大小),但没有定义。前两行现在是定义(没有实现)。@max66谢谢。更新。是的,一个大小是多余的。但是,如果代码是多线程的,并且我们试图并行计算多个求和,该怎么办?这还能用吗?我注意到在这个解决方案中使用了许多静态变量,您标记了C++11,所以我想您不能使用C++17,但是模板求和是新的C++17模板折叠在C++17中的典型工作,它将是
(Args+…)
。您标记了C++11,所以我想您不能使用C++17,但是模板求和是新的C++17模板折叠的典型工作,在C++17中,它将是
(Args+…)
1 + summation<2, 3, 4>::value;  // Trims out first parameter; matches variadic version

2 + summation<3, 4>::value;    // Again, trims out first parameter;matches variadic version

3 + summation<4>::value;  // Matches <size> version. You support signature up-to this point

4 + summation<>::value;   // summation<> definition is missing in your code!!