ideas icon indicating copy to clipboard operation
ideas copied to clipboard

Добавить в switch атрибут [[autobreak]]

Open apolukhin opened this issue 5 years ago • 2 comments

Перенос предложения: голоса +7, -0 Автор идеи: Игорь Савенков

Собственно, предлагаю добавить в switch атрибут [[autobreak]] Из названия можно догадаться, что autobreak нужен чтобы меньше писать break;

Аргументы "за":

Имхо, ситуации, когда break пропущен и это сделано намеренно возникают значительно реже, чем когда он просто забыт по недосмотру, (яркое подтверждение этого - существование [[fallthrough]]). Поэтому неплохо бы иметь способ поменять поведение по-умолчанию.

С этим атрибутом код становится чуть лаконичнее. Вместо такого:

switch (direction) 
{
case Dir::left:
    moveLeft();
    break;
case Dir::right:
    moveRight();
    break;
default:
    notMove();
    break;
}

Будет немного более короткая версия. Ну и удастся избежать ошибок со случайно пропущенным break

[[autobreak]] switch (direction) 
{
case Dir::left:
    moveLeft();
case Dir::right:
    moveRight();
default:
    notMove();
}

Можно убрав переносы строк даже еще чутка сократить, почти не потеряв читаемость (но здесь уже вкусовщина)

[[autobreak]] switch (direction) 
{
case Dir::left:  moveLeft();
case Dir::right: moveRight();
default:         notMove();
}

apolukhin avatar Apr 02 '21 15:04 apolukhin

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();
}

apolukhin avatar Apr 02 '21 15:04 apolukhin

Хотелось бы, чтобы просто завезли в плюсы нормальное сопоставление с образцом из функциональных языков.

humanzer0 avatar Oct 04 '21 11:10 humanzer0