打包的variadic模板具有零元素时的递归

问题描述 投票:0回答:2

我有一个这样的课:

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

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

c++ c++11 variadic-templates
2个回答
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
投票

这段代码:

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

© www.soinside.com 2019 - 2024. All rights reserved.