C++模板元-质数序列

C++模板元-质数序列

花了一点时间巩固自己的模板元编程,写了一个编译期质数数组生成器

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>

template <bool b>
struct bool_instant
{
constexpr static int value = b;
};

using true_instant = bool_instant<true>;
using false_instant = bool_instant<false>;

template <int... pack>
struct intArrayPack
{
constexpr static int length = sizeof...(pack);
constexpr static int value[sizeof...(pack)] = {pack...};
};

template <int N, int current = 2, int flag = 0>
struct isPrime : isPrime<N, current + 1, !!!(N % current)>{};

template <int N>
struct isPrime<N, N, 0> : true_instant{};

template <int N, int current>
struct isPrime<N, current, 1> : false_instant{};

template <int N, int current = 2, bool flag = false, int... pack>
struct primePack : primePack<N, current + 1, isPrime<current>::value, pack...>{};

template <int N, int current, int... pack>
struct primePack<N, current, true, pack...> : primePack<N, current, false, current - 1, pack...>{};

template <int N, int... pack>
struct primePack<N, N, false, pack...> : intArrayPack<pack...>{};

int main()
{
auto numlist = primePack<220>::value;
for (auto i = 0; i < primePack<220>::length; i++)
{
std::cout << numlist[i] << " ";
}
return 0;
}

讲解

1
primePack<220>::value

输出小于输入数字的所有质数组成的数组

1
primePack<220>::length

输出上述数组的长度

重要的是intArrayPack这种通过形参包生成对应序列的方法,以及primePack这种通过truefalse,利用模板特化进行if的模式

本身代码在MSVC for amd64最大只能输出到227的质数,在之后就会报错,原因是模板递归超过上限,因而代码仍需要优化,但作为一个练手的,第一次写模板元编程,也挺不错的