根据在a previous thread中找到的答案,我正在尝试颠倒模板可变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我做错什么了?
发布于 2018-05-13 23:24:53
我做错了什么?
想一想你在这里做什么:
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<>>
{ };https://stackoverflow.com/questions/50314542
复制相似问题