反转模板(整数)参数的顺序

Reversing the order of template (integer) parameters

本文关键字:参数 顺序 整数      更新时间:2023-10-16

我正在尝试根据在上一个线程中找到的答案来反转模板可变参数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

我做错了什么?

我做错了什么?

想想你在这里做什么:

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
...

我们不会颠倒顺序。我们只是旋转它一整圈。这就是为什么我们最终打印同样的东西。

您需要做的是将每个元素预先附加到不同的序列:

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<>>
{ };