我有一个模板类,它采用无符号整数作为模板参数,但我必须确保该数字是素数。例如,我可以在构造函数中检查它,但最好在编译期间进行。
这是我正在使用的断言模板:
template <bool statement>
class Assert;
template <>
struct Assert<true> {};
我可以简单地在任何要编译的代码中创建一个这种类型的对象,使用我的条件作为参数,如果条件为假,它将不会编译。问题是我必须检查某个数字是否是素数。让它成为n。
我想出了包含一个单独的文件“PrimeTest.h”的想法,并通过在该文件中包含相同的文件来尝试将 n 除以从 n-1 到 1 的每个数字。这就是我使用它的方式:
#define SUSPECT n
#include "PrimeTest.h"
这是“PrimeTest.h”:
#ifdef SUSPECT
#ifndef CURRENT
#define CURRENT (SUSPECT-1)
#endif // CURRENT
#ifndef FINISHED
#if CURRENT>100
#define IS_PRIME
#define FINISHED
#else
#if SUSPECT%CURRENT==0
#define IS_NOT_PRIME
#define FINISHED
#else
#define CURRENT (CURRENT-1) // THAT DOES NOT WORK!!!
#include "PrimeTest.h"
#endif // SUSPECT % CURRENT != 0
#endif
#endif // FINISHED
#endif // SUSPECT
但问题是:我无法以任何我能想到的方式减少 CURRENT,包括临时值和 #pragma push_macro 指令。任何想法如何做到这一点?