【发布时间】:2020-11-18 18:59:37
【问题描述】:
我遇到了一个模板元编程挑战,即仅使用 C++11 标准打印出一系列 2 的幂的整数,我已经成功完成了:
#include <iostream>
template <size_t... Ns>
struct index_sequence
{
static void print()
{
const size_t numbers[] = {Ns...};
for (const auto& number : numbers)
{
std::cout << number << ", ";
}
std::cout << std::endl;
}
};
//#include <cmath>
template <size_t Counter, size_t... Rest>
struct make_sequence_impl
{
using type = typename make_sequence_impl<
Counter - 1,
static_cast<size_t>(1) << Counter, Rest...>::type;
};
template <size_t... Rest>
struct make_sequence_impl<0, Rest...>
{
using type = index_sequence<static_cast<size_t>(1) << 0, Rest...>;
};
template <size_t T>
using make_sequence = typename make_sequence_impl<T>::type;
int main()
{
make_sequence<N>::print();
}
假设 N 为 5,它将打印 1、2、4、8、16。
然而,我随后被要求做同样的事情,只是这次我必须以相反的顺序打印它们(即 N = 5 时,16、8、4、2、1)。我完全被难住了,但我很确定它只涉及对代码的轻微更改,我不知道如何。
任何帮助将不胜感激。几天前开始接触模板元编程。
【问题讨论】:
-
在循环中使用
reverse_iterator? -
我会模仿
std::make_integer_sequence拥有sequence<Is...>,然后使用转换方法拥有sequence<(1 << Is)...>或sequence<(1 << (sizeof...(Is) - 1 -Is))...>。
标签: c++ c++11 sequence variadic-templates