рекурсия, когда упакованный шаблон вариации имеет ноль элементов - PullRequest
0 голосов
/ 22 октября 2018

У меня есть такой класс:

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 голосов
/ 22 октября 2018

Этот код:

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

0 голосов
/ 22 октября 2018

Декларация должна быть самой общей, и тогда вы можете частично специализироваться на возможных случаях.Ниже работает решение: 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...