Mam klasę szablonu, która pobiera liczbę całkowitą bez znaku jako parametr szablonu, ale muszę się upewnić, że liczba jest liczbą pierwszą. Mogę to sprawdzić na przykład w konstruktorze, ale lepiej byłoby zrobić to podczas kompilacji.Sprawdź, czy liczba jest liczbą pierwszą podczas kompilacji w C++
Oto szablon Assert Używam:
template <bool statement>
class Assert;
template <>
struct Assert<true> {};
mogę po prostu utworzyć obiekt tego typu w każdym kawałku kodu, który zostanie skompilowany przy użyciu mój stan jako parametr, i wygrał kompiluje, jeśli ten warunek jest fałszywy. Problem polega na tym, że muszę sprawdzić, czy jakaś liczba jest najlepsza. Niech to będzie n.
Wpadłem na pomysł włączenia osobnego pliku "PrimeTest.h" i próby podzielenia n przez każdy numer od n-1 do 1 poprzez włączenie tego samego pliku z wewnątrz tego pliku. To jak go używać:
#define SUSPECT n
#include "PrimeTest.h"
Jest to „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
Ale tutaj jest problem: nie mogę zmniejszyć prąd w żaden sposób nie mogłem wymyślić, w tym wartości tymczasowe i dyrektywy #pragma push_macro. Jakieś pomysły, jak to zrobić?
Jakiego kompilatora używasz? Czy masz dostęp do wszystkich funkcji C++ 11? – Yakk
Używam Microsoft Visual C++, i nie obsługuje jeszcze constexpr. Ale to dobrze, udało mi się poradzić sobie z tym za pomocą dodatkowej struktury szablonu. –
Ayep, są one mniej więcej równoważne. Jeśli potrzebujesz tylko małych liczb pierwszych @ Odpowiedź CygnusX1 zrobi. Odpowiedź "constexpr", którą zrobiłem poniżej, może być dostosowana do rozwiązań opartych na szablonach, jeśli potrzebujesz większych liczb. – Yakk