ist. Ich habe eine Template-Klasse, die eine vorzeichenlose Integer-Zahl als Template-Parameter verwendet, aber ich muss sicherstellen, dass die Zahl eine Primzahl ist. Ich kann es zum Beispiel im Konstruktor überprüfen, aber es wäre besser, es während der Kompilierung zu tun.Überprüfen Sie, ob Nummer während der Kompilierung in C++
Hier ist die Assert Vorlage Ich verwende:
template <bool statement>
class Assert;
template <>
struct Assert<true> {};
Ich kann einfach ein Objekt dieser Art in jedem Stück Code erstellen, die kompiliert werden sollen, meinen Zustand als Parameter verwendet wird, und es gewann Kompiliere nicht, wenn diese Bedingung falsch ist. Das Problem ist, dass ich überprüfen muss, ob eine Zahl prim ist. Lass es n sein.
Ich habe die Idee, eine separate Datei "PrimeTest.h" und versuchen, n durch jede Nummer von n-1 bis 1 zu teilen, indem Sie die gleiche Datei aus dieser Datei enthalten. Das ist, wie ich es verwenden:
#define SUSPECT n
#include "PrimeTest.h"
Dies ist die „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
Aber hier ist das Problem: Ich kann nicht CURRENT in irgendeiner Weise verringern ich tun konnte mit, einschließlich temporärer Werte und # pragma push_macro-Anweisungen. Irgendwelche Ideen, wie man das macht?
Welchen Compiler benutzen Sie? Haben Sie Zugriff auf C++ 11-Funktionen? – Yakk
Ich verwende Microsoft Visual C++ und es unterstützt noch nicht conexpr. Aber das ist gut, ich habe es geschafft, dies mit zusätzlichen Template-Struktur zu bewältigen. –
Ayep, sie sind in etwa gleichwertig. Wenn Sie nur kleine Primzahlen brauchen, reicht die Antwort von CygnusX1. Die "constexpr" Antwort, die ich unten gemacht habe, kann für "Template" basierte Lösungen angepasst werden, wenn Sie größere Zahlen benötigen. – Yakk