Изменение порядка шаблонных (целочисленных) параметров - PullRequest
0 голосов
/ 13 мая 2018

Я пытаюсь изменить порядок последовательности параметров template-variadic std::size_t, основываясь на ответе, найденном в предыдущей теме .Но по какой-то причине это не работает.

Вот обычная функция печати переменных переменных:

template<typename = void>
void print(void)
{
    std::cout << std::endl;
}

template<typename... T>
void print(std::size_t index, T... indexes)
{
    std::cout << index << ' ';
    print(indexes...);
}

А вот цепочка классов шаблонов:

template<std::size_t... Indexes>
class NonRecursiveClass
{
    public:

        void show(void)
        {
            print(Indexes...);
        }
};

template<std::size_t Count, std::size_t Index, std::size_t... Indexes>
class RecursiveClass;

template<std::size_t Count, std::size_t Index, std::size_t... Indexes>
class RecursiveClass : public RecursiveClass<Count - 1u, Indexes..., Index>
{
};

template<std::size_t Index, std::size_t... Indexes>
class RecursiveClass<0u, Index, Indexes...> : public NonRecursiveClass<Index, Indexes...>
{
};

По сути,Идея состоит в том, что если вы создадите, например, объект RecursiveClass<5u, 10u, 1u, 6u, 478u, 23u>, он будет наследоваться от объекта NonRecursiveClass<23u, 478u, 6u, 1u, 10u>, и у вас будет последовательность параметров std::size_t в обратном направлении во время компиляции.

К сожалению, когда я пытаюсьэто, я все еще получаю оригинальный заказ.Вот моя основная функция:

int main(void)
{
    RecursiveClass<5u, 10u, 1u, 6u, 478u, 23u> foo;
    foo.show();
    return 0;
}

А вот и вывод:

10 1 6 478 23

Что я сделал не так?

1 Ответ

0 голосов
/ 13 мая 2018

Что я сделал не так?

Подумайте, что вы здесь делаете:

template<std::size_t Count, std::size_t Index, std::size_t... Indexes>
class RecursiveClass : public RecursiveClass<Count - 1u, Indexes..., Index>

Если вы еще не сделали (то есть,если Count != 0), тогда вы берете первый и перемещаете его назад.Давайте просто следовать этому алгоритму:

RecursiveClass<5, 10, 1, 6, 478, 23>
└─ RecursiveClass<4, 1, 6, 478, 23, 10> // 10 to the back
   └─ RecursiveClass<3, 6, 478, 23, 10, 1> // 1 to the back
      └─ RecursiveClass<2, 478, 23, 10, 1, 6> // 6 to the back
         ...

Мы не обращаем последовательность.Мы просто вращаем его на один полный оборот.Вот почему мы в конечном итоге печатаем одно и то же.

Вам нужно pre - добавить каждый элемент в различную последовательность:

template <std::size_t...> struct sequence;

template <typename T, typename U>
class RecursiveClassImpl;

template <std::size_t I, std::size_t... Is, std::size_t... Js>
class RecursiveClassImpl<sequence<I, Is...>, sequence<Js...>>
    : public RecursiveClassImpl<sequence<Is...>, sequence<I, Js...>>
//                                               ^^^^^^^^^^^^^^^^^^
//                                               NB: prepend
{ };

template <std::size_t... Js>
class RecursiveClassImpl<sequence<>, sequence<Js...>>
    : public NonRecursiveClass<Js...>
{ };

template<std::size_t... Indexes>
class RecursiveClass : public RecursiveClassImpl<sequence<Indexes...>, sequence<>>
{ };
...