#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
Комментариев нет:
Отправить комментарий