gpt4 book ai didi

c++ - 在 C++ 编译期间检查数字是否为质数

转载 作者:可可西里 更新时间:2023-11-01 18:17:25 25 4
gpt4 key购买 nike

我有一个模板类,它采用无符号整数作为模板参数,但我必须确保该数字是质数。例如,我可以在构造函数中检查它,但最好在编译期间进行检查。

这是我正在使用的断言模板:

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 指令。有什么想法吗?

最佳答案

您不需要预处理器在编译时计算某些东西。通常,当需要计算时,您使用模板元编程(或 chris 在他的回答中建议的 constexpr 函数)

通过模板元编程,您可以按如下方式解决任务:

首先你定义一个模板,它可以在编译时检查给定值是否为N。被 D 整除或任何低于 D 的值大于 1。

template <int N, int D>
struct tmp {
static const bool result = (N%D) && tmp<N,D-1>::result;
};

template <int N>
struct tmp<N,1> {
static const bool result = true;
};

tmp<N,D>::resulttrue仅当数字 2、3、... D不分N .

有了上面的工具,创建is_prime编译时检查器相当简单:

template <int N>
struct is_prime {
static const bool result = tmp<N,N-1>::result;
};

现在编译时值is_prime<N>::resulttrue什么时候N是质数,false否则。该值可以提供给更多模板,例如 Assert你的。

关于c++ - 在 C++ 编译期间检查数字是否为质数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16761082/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com