Учитывая этот макрос
#define MAKE_TYPE(_a, _b, _c, _d) ((_a) | ((_b) << 8) | ((_c) << 16) | ((_d) << 24))
Я бы хотел заменить его так, чтобы вместо него использовался массив [4] .
Так что я могу написать MAKE_TYPE ("ABCD") вместо уродливого MAKE_TYPE ('A', 'B', 'C', 'D')
Я использую это во время компиляции для генерации некоторых констант.
Но мне не нравится, когда я передаю такую строку
#define MAKE_TYPE(s) ((s[3]) | ((s[2]) << 8) | ((s[1]) << 16) | ((s[0]) << 24))
ошибка: ссылка на массив не может появляться в константном выражении
Ну, это не сработало. Так что я подумал, что смогу разобраться с этим, используя шаблонное метапрограммирование
template< char[4] s > class MAKE_TYPE
{
public:
enum{ RESULT = s[3] | (s[2] << 8) | (s[1] << 16) | (s[0] << 24) };
};
К сожалению, это тоже не сработало. Я не могу поставить char [4] в шаблон.
И я получаю эти ошибки:
ошибка: ожидается ">" до "s"
ошибка: «s» не было объявлено в этой области
ошибка: ссылка на массив не может появляться в константном выражении
Как я могу это сделать?