Tôi có một lớp mẫu có số nguyên không dấu như tham số mẫu, nhưng tôi phải đảm bảo rằng số đó là số nguyên tố. Tôi có thể kiểm tra nó trong constructor, ví dụ, nhưng nó sẽ là tốt hơn để làm điều đó trong quá trình biên dịch.Kiểm tra xem số có chính trong quá trình biên dịch trong C++
Dưới đây là các mẫu Khẳng định Tôi đang sử dụng:
template <bool statement>
class Assert;
template <>
struct Assert<true> {};
tôi chỉ đơn giản có thể tạo ra một đối tượng kiểu này trong bất kỳ đoạn mã đó sẽ được thu thập, sử dụng tình trạng của tôi như tham số, và nó đã giành không biên dịch nếu điều kiện đó là sai. Vấn đề là tôi phải kiểm tra xem một số có phải là số nguyên tố hay không. Để nó là n.
Tôi đã đưa ra ý tưởng bao gồm một tệp riêng biệt "PrimeTest.h" và cố gắng chia n cho mỗi số từ n-1 đến 1 bằng cách bao gồm cùng một tệp từ bên trong tệp đó. Đó là cách tôi sử dụng nó:
#define SUSPECT n
#include "PrimeTest.h"
Đây là "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
Nhưng đây là vấn đề: Tôi không thể giảm giá trị hiện tại trong bất kỳ cách nào tôi có thể đưa ra, bao gồm các giá trị tạm thời và chỉ thị #pragma push_macro. Bất kỳ ý tưởng nào về cách thực hiện điều đó?
Bạn đang sử dụng trình biên dịch nào? Bạn có quyền truy cập vào bất kỳ tính năng nào của C++ 11 không? – Yakk
Tôi đang sử dụng Microsoft Visual C++ và chưa hỗ trợ constexpr. Nhưng đó là tốt, tôi đã quản lý để đối phó với điều này bằng cách sử dụng cấu trúc mẫu bổ sung. –
Ayep, chúng tương đương nhau. Nếu bạn chỉ cần số nguyên tố nhỏ thì câu trả lời của CygnusX1 sẽ thực hiện. Câu trả lời 'constexpr' tôi đã làm dưới đây có thể được điều chỉnh cho các giải pháp dựa trên' mẫu' nếu bạn cần số lớn hơn. – Yakk