Open apolukhin opened 3 years ago
iksk810, 20 марта 2019, 15:13 Лично я бы хотел вместо этого увидеть нечто похожее на when из kotlin-а. Например:
auto value = when(error_code) {
network_error -> doSomething()
database_error -> doAnother()
user_error -> doSomethingElse()
default -> doDefault()
}
Игорь Савенков, 21 марта 2019, 4:50 iksk810, а какое значение будет в value?
и я в описании синтаксиса when в kotlin видел ветку else. но не видел default. Перепутал?
https://kotlinlang.org/docs/reference/control-flow.html#when-expression
iksk810, 21 марта 2019, 5:32 В value будет ровно то, что вернёт конкретное выбранное выражение. Типы должны совпадать, разумеется.
Что касаемо синтаксиса, то это не так принципиально. На вкус и цвет. )
Andrey Davydov, 21 марта 2019, 9:55 Сейчас уже всерьез обсуждается настоящий pattern matching, причем ставят амбициозную цель успеть к C++23. Текущий proposal: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1371r0.pdf
Alexey Kreschuk, 21 марта 2019, 21:44 Насколько я помню, компилятор должен игнорировать неизвестные аттрибуты. Если он проигнорирует [[autobreak]], поведение программы изменится. Ловить эту проблему значительно сложнее, чем везде писать break, тем более что об отсутствии break'а есть warning.
Игорь Савенков, 22 марта 2019, 5:42 Alexey Kreschuk, да мне уже указали в "соседнем" предложении, что атрибуты плохо подходят для изменения поведения кода. Поэтому вот еще один вариант синтаксиса ниже ↓
Игорь Савенков, 22 марта 2019, 5:38 Меня сегодня на еще один вариант синтаксиса натолкнули, имхо, этот вариант лучше смотрится и + решает проблему с "обратной несовместимостью", которую не может решить атрибут:
int v = 0;
switch break (v)
{
case 0: zero();
case 1: one();
default: default();
}
Хотелось бы, чтобы просто завезли в плюсы нормальное сопоставление с образцом из функциональных языков.
Перенос предложения: голоса +7, -0 Автор идеи: Игорь Савенков
Собственно, предлагаю добавить в switch атрибут [[autobreak]] Из названия можно догадаться, что autobreak нужен чтобы меньше писать break;
Аргументы "за":
Имхо, ситуации, когда break пропущен и это сделано намеренно возникают значительно реже, чем когда он просто забыт по недосмотру, (яркое подтверждение этого - существование [[fallthrough]]). Поэтому неплохо бы иметь способ поменять поведение по-умолчанию.
С этим атрибутом код становится чуть лаконичнее. Вместо такого:
Будет немного более короткая версия. Ну и удастся избежать ошибок со случайно пропущенным break
Можно убрав переносы строк даже еще чутка сократить, почти не потеряв читаемость (но здесь уже вкусовщина)