std::string в условиях switch

Рейтинг: 2Ответов: 1Опубликовано: 26.04.2015

На хаьре читал, что в стандарте C++11 можно заюзать string в качестве условия для switch(http://habrahabr.ru/post/166201/).

Но у меня сейчас это не сработало:

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string s("s");

    switch(s) {
        case "s": cout<<s;
    }
}

main.cpp: In function 'int main()':

main.cpp:10:13: error: switch quantity not an integer

     switch(s) {

             ^

main.cpp:11:14: error: could not convert '"s"' from 'const char [2]' to '<type error>'

         case "s": cout<<s;

Что-то изменилось?

(gcc-4.9)

Ответы

▲ 6Принят

В статье описан грубый хак с макросами, основанный на вычислении хэш-функции. Он работает лишь для коротких строк, содержащих лишь английские символы с кодами 1-127.

По стандарту, switch со строками как было нельзя использовать, так и осталось.


Почему же switch не разрешают использовать со строками? Дело в том, что корректная проверка равенства строк — дорогостоящая операция. А идея switch как раз и состоит в том, что он вычисляется быстро — например, константы в case вполне могут быть индексами в таблице переходов (как, например, делает Java).

Например, код

switch (n)
{
case 1:
    printf("1");
    break;
case 2:
    printf("2");
    // fallthrough
case 3:
    printf("3");
}

вполне может скомпилироваться в такой псевдокод:

void* jumptable[] = { 0x0, &case1, &case2, &case3 };

if (n < 1 || n > 3) goto next;
goto jumptable[n];

case1:
printf("1");
goto next;

case2:
printf("2");

case3:
printf("3");

next:

Со строками такой трюк не пройдёт.


Дополнительное чтение по теме switch: Duff's Device.