Я хочу создать структуру, которая статически выделяет массив из 2^N байтов, но я не хочу, чтобы пользователи этой структуры указывали это размер в качестве показателя. Пример:
my_stupid_array a1; // I want this!
my_stupid_array a2; // And not this...
Как проверить, является ли этот параметр шаблона степенью двойки и предупредить пользователя приятным сообщением об этом?
Я смог проверить это с помощью простого шаблона:
template
struct is_power_of_two {
enum {val = (N >= 1) & !(N & (N - 1))};
};
Однако я не могу предупредить пользователя об этом вменяемым сообщением. Любые идеи?
РЕДАКТИРОВАТЬ
Исправлен неоднозначный пример.
РЕДАКТИРОВАТЬ
1 действительно является степенью двойки. Исправлено! :)
РЕДАКТИРОВАТЬ
Используя BOOST_STATIC_ASSERT, я получаю эту ошибку компиляции для этого кода с GCC:
template
struct is_power_of_two {
enum {val = (N >= 1) & !(N & (N - 1))};
BOOST_STATIC_ASSERT(val);
};
Ошибка
..\main.cpp:29:1: error: invalid application of 'sizeof' to incomplete type 'boost::STATIC_ASSERTION_FAILURE'
РЕДАКТИРОВАТЬ
О, Я понимаю. Это было сообщение, которое я должен был получить, когда утверждение терпит неудачу. Но это не дает пользователю нормального сообщения. :(