生成整数序列的简单线性方法很容易适应排除特定项目,方法是添加一个涵盖项目被排除的情况的特化:
#include <iostream>
// general case, ignores X
template <int N, int X, int... vals>
struct gen_seq : gen_seq<N - 1, X, N - 1, vals...> { };
template <int X, int... vals>
struct gen_seq<0, X, vals...> { static constexpr int values[] = { vals... }; };
// specialisations when vals has had X prepended: remove X
template <int N, int X, int... vals>
struct gen_seq<N, X, X, vals...> : gen_seq<N, X, vals...> { };
template <int... vals>
struct gen_seq<0, 0, 0, vals...> : gen_seq<0, 0, vals...> { };
template <int X, int... vals>
constexpr int gen_seq<0, X, vals...>::values[];
int main() {
for (auto i : gen_seq<5, 2>::values) std::cout << i << std::endl; // 0 1 3 4
for (auto i : gen_seq<3, 0>::values) std::cout << i << std::endl; // 1 2
for (auto i : gen_seq<4, 4>::values) std::cout << i << std::endl; // 0 1 2 3
}
它可能不如其他更高级的方法高效,但它是最易读的。与您自己的答案和 Jarod42 的不同,这不会在现有算法的基础上构建新算法,而是从头开始构建新算法。