#cpp
Есть вот такой пользовательский литерал. Я бы хотел выкинуть предупреждение в случае
если принимаемое значение не лежит в диапазоне 0..7. Могу ли я этого добиться?
constexpr unsigned char operator"" _cmd(const char command) {
if (command == '>')
return 0;
else if (command == '<')
return 1;
else if (command == '+')
return 2;
else if (command == '-')
return 3;
else if (command == ',')
return 4;
else if (command == '.')
return 5;
else if (command == '[')
return 6;
else if (command == ']')
return 7;
else
static_assert(, "INVALID COMMAND");
}
Ответы
Ответ 1
В данном случае похоже, что натурального решения со static_assert нет, ибо ваша функция в общем случае совсем не обязательно вычисляется во время компиляции. Однако вы можете воспользоваться хитростью и вместо static_assert использовать throw или любую другую конструкцию, которая заведомо "убивает" constexpr-ность функции ... else if (command == ']') return 7; else throw 0; Это приведет к тому, что именно данная ветка логики функции никогда не будет константным выражением. В тех контекстах, где язык требует константного выражения, будет происходить ошибка компиляции templatestruct S{}; int main() { S<'+'_cmd>(); // OK S<'/'_cmd>(); // Error constexpr int a = ','_cmd; // OK constexpr int b = ':'_cmd; // Error } К сожалению, в тех контекстах, где константного выражения не требуется, ошибки компиляции не будет, а будет полноценное бросание исключения во время выполнения. То есть вам, для достижения изначальной цели (ошибки компиляции при неправильном аргументе) придется самому внимательно следить за тем, чтобы литерал использовался только в контекстах, требующих константного выражения. Ответ 2
В с++ 14 должно работать. else assert(false && "INVALID COMMAND"); При этом, если assert сработает на этапе компиляции, она упадёт. P.s сам не проверял, но пруф: https://www.google.com/amp/s/akrzemi1.wordpress.com/2017/05/18/asserts-in-constexpr-functions/amp/ Там есть способ это сделать и на с++ 11
Комментариев нет:
Отправить комментарий