Вы оптимизируете [*] операторы переключателя, выполняя как можно меньше работы с переключателем (поскольку неясно, будет ли компилятор распространять дублирование). Если вы настаиваете на возврате строки по указателю и использовании оператора switch, я бы написал:
string *convertToString(int i) {
const char *str;
switch(i) {
case 1 : str = "one"; break;
// etc
default : str = "error"; break;
}
return new string(str);
}
Но, конечно, для этого примера я бы, вероятно, просто использовал справочную таблицу:
const char *values[] = {"error", "one", ... };
string convertToString(unsigned int i) {
if (i >= sizeof(values)/sizeof(*values)) i = 0;
return values[i];
}
Тем не менее, я только что ответил на вопрос о фиаско статического порядка инициализации, так что вам вообще не нужны эмпирические правила, которые требуют глобальных переменных. То, что вы делаете, должно зависеть от контекста функции.
[*] Здесь я имею в виду тот тип оптимизации, который используется при написании переносимого кода или в первой версии в надежде на создание понятного для чтения кода, который не потребует слишком много реальная оптимизация. Реальная оптимизация включает в себя реальные измерения.