【发布时间】:2013-05-21 14:18:46
【问题描述】:
我有一个模板类,它接受一个无符号整数作为模板参数,但我必须确保该数字是素数。例如,我可以在构造函数中检查它,但最好在编译期间进行。
这是我正在使用的断言模板:
template <bool statement>
class Assert;
template <>
struct Assert<true> {};
我可以简单地在任何将要编译的代码中创建一个这种类型的对象,使用我的条件作为参数,如果条件为假,它将不会编译。问题是我必须检查某个数字是否是素数。就这样吧。
我想出了包含一个单独的文件“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 指令。 任何想法如何做到这一点?
【问题讨论】:
-
你用的是什么编译器?您可以访问任何 C++11 功能吗?
-
我使用的是 Microsoft Visual C++,它还不支持 constexpr。但这很好,我已经设法使用额外的模板结构来解决这个问题。
-
是的,它们大致相当。如果您只需要小素数@CygnusX1 的答案就可以了。如果您需要更大的数字,我在下面所做的
constexpr答案可以适用于基于template的解决方案。
标签: c++ compilation c-preprocessor primes