[Из песочницы] Еще один «switch для строк» — но не только для строк и не только «switch»

Данная заметка спровоцирована интересным топиком на habrahabr.ru/post/166201/ о Switch операторе для C++ и желанием предоставить сообществу еще одну идею и воплощение на оценку.

Одним из недостатков оператора Switch в C++ является ограниченность по типу данных к которым возможно его применение и автор статьи по ссылке привел интересное решение.

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

Т.е. Еще один «switch для строк» — но не только для строк и не только «switch».

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

Идея заключается в использовании тернарного оператора ?: в условии Switch

допустим “test” тестовая переменная а “var_ i” i=1,..,4 это переменные с которыми ее нужно сравнить

из конструкции

bool bool_1, bool_2, bool_3, bool_4;
bool_1 = (test == var_1);
bool_2 = (test == var_2);
bool_3 = (test == var_3);
bool_4 = (test == var_4);

видно, что bool_ i i=1,..,4 это логические условия а переменные test и var_i i=1,..,4 могут быть любых типов, главное они однотипные.

идея в следющей строке

switch((bool_1?1:0)|(bool_2?2:0)|(bool_3?4:0)|(bool_4?8:0))

и заключается в том что switch будет получать для принятия решения результат операции “или” на двоичных степенях двоек.

Это дает не только класический switch, но и обещанную обработку всех истинностных вариантов т.е. всех 16 вариантов для 4-х условий.

Условия в switch можно добавлять в любом количестве сохраняя последовательные степени двойки в втором аргументе каждого тернарного оператора

Объяснение далее:

Читать дальше →

© Habrahabr.ru