Switch для строк в C++11

К сожалению, стандарт C++ не допускает применения операторов switch-case к строковым константам. Хотя в других языках, вроде C#, такая возможность имеется прямо «из коробки». Поэтому, понятное дело, многие C++ программисты пытались написать свою версию «switch для строк» — и я не исключение.
Для C++03 решения не отличались красотой и лишь усложняли код, дополнительно нагружая приложение в рантайме. Однако с появлением C++11 наконец-то появилась возможность реализовать такой код:

   std::string  month;
   std::string  days;

   std::cout << "Enter month name: ";
   std::cin  >> month;

   SWITCH (month)
   {
      CASE("february"): days = "28 or 29"; break;

      CASE("april"):
      CASE("june"):
      CASE("september"):
      CASE("november"): days = "30"; break;

      CASE("january"):
      CASE("march"):
      CASE("may"):
      CASE("july"):
      CASE("august"):
      CASE("october"):
      CASE("december"): days = "31"; break;

      DEFAULT: days = "?"; break;
   }

   std::cout << month << " has " << days << " days." << std::endl;

Реализация этой конструкции весьма проста. Она основана на constexpr-функциях из C++11, благодаря чему почти все вычисления производятся ещё на этапе компиляции. Если кого-то интересуют её детали, добро пожаловать под кат — благо на Хабре о «switch для строк» почему-то ничего не сказано.
Если кому интересно

© Habrahabr.ru