Ho una classe template che accetta un intero senza segno come parametro del modello, ma devo assicurarmi che quel numero sia un numero primo. Posso controllarlo nel costruttore, ad esempio, ma sarebbe meglio farlo durante la compilazione.Controlla se il numero è primo durante la compilazione in C++
Ecco il modello Assert sto usando:
template <bool statement>
class Assert;
template <>
struct Assert<true> {};
posso semplicemente creare un oggetto di questo tipo, in ogni pezzo di codice che sta per essere compilato, usando la mia condizione come parametro, e ha vinto compilare se questa condizione è falsa. Il problema è che devo controllare se un numero è primo. Lascia che sia n.
Mi è venuta l'idea di includere un file separato "PrimeTest.h" e provare a dividere n per ogni numero da n-1 a 1 includendo lo stesso file all'interno di quel file. Ecco come lo uso:
#define SUSPECT n
#include "PrimeTest.h"
Questo è il "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
Ma ecco il problema: non riesco a diminuire CORRENTE in alcun modo ho potuto venire con, compresi i valori temporanei e le direttive #pragma push_macro. Qualche idea su come farlo?
Che compilatore stai utilizzando? Hai accesso a tutte le funzionalità di C++ 11? – Yakk
Utilizzo Microsoft Visual C++ e non supporta ancora constexpr. Ma va bene, sono riuscito a farcela usando una struttura di template aggiuntiva. –
Ayep, sono approssimativamente equivalenti. Se hai solo bisogno di piccoli numeri primi, la risposta di CygnusX1 sarà valida. La risposta 'constexpr' che ho fatto qui sotto può essere adattata per le soluzioni basate su' template' se hai bisogno di numeri più grandi. – Yakk