Tôi muốn tạo cấu trúc phân bổ tĩnh một mảng 2^N byte, nhưng tôi không muốn người dùng của cấu trúc này chỉ định kích thước này làm số mũ. Ví dụ:Làm cách nào để kiểm tra xem thông số mẫu có phải là một tham số của hai không?
my_stupid_array<char, 32> a1; // I want this!
my_stupid_array<char, 5> a2; // And not this...
Làm thế nào để kiểm tra xem thông số mẫu này là một sức mạnh của hai và cảnh báo người sử dụng với một thông điệp tốt đẹp về điều này?
tôi đã có thể để kiểm tra điều này với một mẫu đơn giản:
template<int N>
struct is_power_of_two {
enum {val = (N >= 1) & !(N & (N - 1))};
};
Tuy nhiên, tôi không thể để cảnh báo người dùng về vấn đề này với một thông điệp lành mạnh. Bất kỳ ý tưởng?
EDIT
cố định ví dụ rõ ràng.
EDIT
1 là một sức mạnh của hai thực sự. Đã sửa lỗi đó! :)
EDIT
Sử dụng BOOST_STATIC_ASSERT, tôi nhận được lỗi biên dịch này cho mã này với GCC:
template<int N>
struct is_power_of_two {
enum {val = (N >= 1) & !(N & (N - 1))};
BOOST_STATIC_ASSERT(val);
};
Lỗi
..\main.cpp:29:1: error: invalid application of 'sizeof' to incomplete type 'boost::STATIC_ASSERTION_FAILURE<false>'
EDIT
Ồ, tôi hiểu rồi. Đó là thông điệp mà tôi phải nhận được khi khẳng định thất bại. Nhưng điều đó không cung cấp cho người dùng một số thông điệp lành mạnh.:(
8 là công suất của 2 ... –
Nó có nghĩa là một ví dụ về số mũ làm tham số. 2^8 = 256 – jrok
> 'my_stupid_array a2; // Và không phải điều này ... 'tại sao không phải thế này? –
triclosan