Функциональный switch

valera_ee
valera_ee

Во многих языка оператор switch умеет сравнивать не только целочисленные значения, но и строки, и много чего ещё. Возникает вопрос, почему у нас самый ущербный по функциональности этот оператор. Почему не сделать так, что бы можно было задавать произвольный тип для которого определён оператор сравнения или можно было бы указать функцию, которая будет сравнивать входное значение с case-ами?

Пример со строками:

constexpr std::string_view str_case1 {"state 1"};
constexpr std::string_view str_case2 {"state 2"};
constexpr std::string_view str_case3 {"state 3"};

std::string any_text {"tate 2"};

switch (any_text)
{
    case str_case1:
        std::cout << "state 1";
        break;

    case str_case2:
        std::cout << "state 2";
        break;

    default:
        std::cout << "default state";
        break;
}

Или вариант с заданной функцией сравнения:

 

static const Regression regression_case1(Regression::Linear);
static const Regression regression_case2(Regression::Cubic);
static const Regression regression_case3(Regression::Logarithmic);

bool regression_cmp(const Regression &a, const Regression &b);

Regression m_regression = optimalRegression({2, 5, 7, 8}, {3, 7, 8, 9});

switch (m_regression; regression_cmp)
{
    case regression_case1:
        std::cout << "optimal linear regression";
        break;

    case regression_case2:
        std::cout << "optimal cubic regression";
        break;

    default:
        std::cout << "optimal logarithmic regression";
        break;
}

Не могу судить о потери производительности, но функциональность оператора возрастёт.

10
рейтинг
4 комментария
Владислав Петров

семантика switch не подразумевает ничего кроме jmp по, простите, lbl. Тогда уж new keyword типа typedswitch, match? 

Владислав Петров
Walery

Не хотелось бы видеть новые ключенвые слова. Пусть компилятор в зависимости от типов сам решает, что использовать в конкретном случае.

Walery
Виктор Губин

Судя по всему введут новый оператор inspect.

inspect (s) {
   "foo": std::cout << "got foo";
   "bar": std::cout << "got bar";
   _: std::cout << "don't care";
}

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1371r0.pdf

ИМХО новый оператор гораздо выглядит гораздо удобнее.

 

Виктор Губин
valera_ee

Появление новых ключевых слов усложняет язык, на мой взгляд лучше расширить функциональность текущего оператора, так в голове надо меньше держать.

Мне понравился оператор swith в языке Swift, очень функциональный, после него возвращаясь на С++ ипытываешь "функциональное голодание".

 

 

valera_ee
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).
Все предложения