我有一个这样的班级:
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。谢谢
注意:我也希望它在多线程环境中工作,在该环境中,求和可以由具有不同参数的不同线程同时调用。为了在多线程环境中工作,需要进行哪些更改?谢谢
答案 0 :(得分:4)
声明应该是最通用的声明,然后可以对可能的情况进行部分专门化。以下解决方案有效: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;
}
答案 1 :(得分:1)
此代码:
import csv
e = {'Jay':10,'Ray':40}
c = {'Google':5000, 'Yahoo': 3000}
def writeData():
with open('employee_file20.csv', mode='w') as csv_file:
fieldnames = ['emp_name', 'age', 'company_name', 'size']
writer = csv.writer(csv_file)
writer.writerow(fieldnames)
for employee, company in zip(e.items(), c.items()):
writer.writerow(employee + company)
writeData()
翻译
size + summation<sizes...>::value;
进入
summation<1,2,3,4>::value
此处有更详细的说明。 https://stackoverflow.com/a/48003232/1465553