我有一个这样的课:
template<std::size_t T, std::size_t... Args>
class A{
public:
std::array<int,summation<Args...>::value> x;
}
其中summation
定义为:
template<std::size_t size, std::size_t... sizes>
struct summation
{
static const std::size_t value = size + summation<sizes...>::value;
};
template<std::size_t size>
struct summation<size>
{
static const std::size_t value = size;
};
问题是,当Args为空(即,我只指定T
模板)时,基本情况不起作用,我收到编译错误消息:
error: wrong number of template arguments (0, should be 1 or more)
如何在summation
中修改sizeof...(Args)==0
的递归以正确处理这种情况,并在这种情况下为求和返回值0?我正在使用C ++ 11。谢谢
注意:我还希望这在多线程环境中工作,其中求和可以由具有不同参数的不同线程同时调用。在多线程环境中工作需要进行哪些更改?谢谢
声明应该是最通用的声明,然后你可以部分专注于可能的情况。以下解决方案有效:https://godbolt.org/z/Ye7xEJ
template<std::size_t... sizes>
struct summation;
template<std::size_t size, std::size_t... sizes>
struct summation<size, sizes...>
{
static const std::size_t value = size + summation<sizes...>::value;
};
template<>
struct summation<> {
static const std::size_t value = 0;
};
std::size_t foo() {
return summation<1,3,4>::value;
}
std::size_t foo2() {
return summation<>::value;
}
这段代码:
size + summation<sizes...>::value;
转换
summation<1,2,3,4>::value
成
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!!
这里有更详细的解释。 https://stackoverflow.com/a/48003232/1465553