反转模板(整数)参数的顺序
Reversing the order of template (integer) parameters
我正在尝试根据在上一个线程中找到的答案来反转模板可变参数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<>>
{ };
相关文章:
- 函数调用中参数的顺序重要吗
- C++部分概念 id:显式模板规范顺序/第一个参数的特殊状态的原因是什么?
- lambda 作为接受其他参数的参数的初始化顺序
- 如何实现对参数顺序不可知的std::same_as的广义形式(即对于两个以上的类型参数)
- 约束模板参数顺序的更简单方法
- 正确对齐内存模板,参数顺序不变
- 具有不同参数顺序的聚合初始化
- glDrawArrays的意外行为-参数顺序错误会产生所需的图像
- 函数的参数顺序
- 推导的模板参数顺序
- 对"pthread_key_create"的未定义引用;参数顺序不能解决问题
- 参数顺序评估
- Printf参数顺序被忽略
- 通过交换参数顺序来重载函数
- 可变模板参数顺序,必须总是最右边的参数
- 如何反转可变参数模板函数的参数顺序
- Lua元事件参数顺序
- 'stringstream'参数顺序问题
- 宏参数顺序很重要
- sequence before:不同函数的参数顺序