压缩可变参数模板具有零元素时的递归

时间:2018-10-22 02:41:45

标签: c++ c++11 variadic-templates

我有一个这样的班级:

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。谢谢

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

2 个答案:

答案 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