实现用于生成具有给定范围的索引序列的 C++ 模板
Implement C++ template for generating an index sequence with a given range
所以,C++14提供了struct make_index_sequence<N>
来生成从0
到N-1
的索引序列。我想知道如何实现一个在给定范围内生成索引序列。例如:
template <size_t Min, size_t Max>
struct make_index_range;
// make_index_range<5, 9> will give index_sequence<5, 6, 7, 8>
您定义 index_range
的方式(在编辑问题之前)答案很简单:
template<std::size_t Min, std::size_t Max>
using make_index_range = index_range<Min, Max>;
这不是很有用。
所以我假设你的意思是 make_index_range<5, 9>
会给出 index_sequence<5, 6, 7, 8>
,可以这样做:
#include <utility>
template<std::size_t N, std::size_t... Seq>
constexpr std::index_sequence<N + Seq ...>
add(std::index_sequence<Seq...>)
{ return {}; }
template<std::size_t Min, std::size_t Max>
using make_index_range = decltype(add<Min>(make_index_sequence<Max-Min>()));
或者,如果您希望 make_index_range
成为 class 模板,请按上述方式定义 add
,然后:
template<std::size_t Min, std::size_t Max>
struct make_index_range {
using type = decltype(add<Min>(make_index_sequence<Max-Min>()));
};
(但是你必须使用 make_index_range<5, 9>::type
所以别名模板可能更好,更接近 make_index_sequence
的工作方式。)
所以,C++14提供了struct make_index_sequence<N>
来生成从0
到N-1
的索引序列。我想知道如何实现一个在给定范围内生成索引序列。例如:
template <size_t Min, size_t Max>
struct make_index_range;
// make_index_range<5, 9> will give index_sequence<5, 6, 7, 8>
您定义 index_range
的方式(在编辑问题之前)答案很简单:
template<std::size_t Min, std::size_t Max>
using make_index_range = index_range<Min, Max>;
这不是很有用。
所以我假设你的意思是 make_index_range<5, 9>
会给出 index_sequence<5, 6, 7, 8>
,可以这样做:
#include <utility>
template<std::size_t N, std::size_t... Seq>
constexpr std::index_sequence<N + Seq ...>
add(std::index_sequence<Seq...>)
{ return {}; }
template<std::size_t Min, std::size_t Max>
using make_index_range = decltype(add<Min>(make_index_sequence<Max-Min>()));
或者,如果您希望 make_index_range
成为 class 模板,请按上述方式定义 add
,然后:
template<std::size_t Min, std::size_t Max>
struct make_index_range {
using type = decltype(add<Min>(make_index_sequence<Max-Min>()));
};
(但是你必须使用 make_index_range<5, 9>::type
所以别名模板可能更好,更接近 make_index_sequence
的工作方式。)