我有一个模板类,它以无符号整数为模板参数,但我必须确保该数字是素数。例如,我可以在构造函数中检查它,但最好在编译期间进行检查。
这是我正在使用的Assert模板:
template <bool statement>
class Assert;
template <>
struct Assert<true> {};
我可以在任何将被编译的代码中简单地创建这种类型的对象,使用我的条件作为参数,如果该条件为false,则不会编译。问题是我必须检查某个数字是否为质数。假设这个数字是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 指令。你有任何想法吗?
constexpr
答案可以适用于基于template
的解决方案,如果你需要更大的数字。 - Yakk - Adam Nevraumont