Чем заменить if () else if() else if() else if() else...
От:
Аноним
Дата:
28.01.07 15:12
Оценка:
Вот возникла одна мысль, возможно ли так сделать господа?
uinsigned int MyHash(char *p_Str)
{
// Какой либо алгоритм хеширования строки ...
return l_Hash;
}
.....
void MyFunc(char *p_Str)
unsigned int l_State = MyHash(p_Str);
switch(l_State)
{
case MYHASH("command"):
{
...
}
case MYHASH("event"):
{
...
}
case MYHASH("tram-ta-ra-ram"):
{
...
}
}
где MYHASH — макрос, который по сути делает со строкой то-же что и функция MyHash, но перед компиляцией, чтоб в case на момент компиляции уже были константы.
Если такое возможно, то как должен выглядеть такой макрос???
Re: Чем заменить if () else if() else if() else if() else...
Здравствуйте, Аноним, Вы писали:
А>Если такое возможно, то как должен выглядеть такой макрос???
1) Вообще говоря мне кажется, что if() {} else if(){} else if() {} else {} читабельнее. И зачем с этим бороться -- не понятно...
2) Конечно может так статься, что список длинный, обработчики сложные, а место критичное по времени. Но тогда мне больше нравится заводить объект-механизм, в котором есть регистратор обработчика по ключу, выглядит это как-то так:
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: Чем заменить if () else if() else if() else if() else
Здравствуйте, Draqon, Вы писали:
D>Если всё известно на этапе компиляции, то можно (теоретически) соорудить вычисление хэша с помощью темплейтов. D>Курить товарища Александреску.
Два вопроса.
1) А как может быть не известно на этапе компиляции, если ты хочешь привесить к ключам обработчики?
2) Зачем всё делать так сложно? Может тогда уж лучше завести какую-то свою конструкцию и того, препроцессировать внешним инструментом?
Всё-таки проще как-то будет и понятнее.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: Чем заменить if () else if() else if() else if() else
Здравствуйте, Erop, Вы писали:
E>2) Зачем всё делать так сложно? Может тогда уж лучше завести какую-то свою конструкцию и того, препроцессировать внешним инструментом? E>Всё-таки проще как-то будет и понятнее.
Тоже вариант, и тоже не идеален. Я просто отвечал на вопрос, я не утверждаю, что именно так и нужно делать
Re: Чем заменить if () else if() else if() else if() else...
Здравствуйте, Аноним, Вы писали: А>unsigned int l_State = MyHash(p_Str);
А>switch(l_State) А>{ А> case MYHASH("command"): А> { А> ... А> }
А> case MYHASH("event"): А> { А> ... А> }
А> case MYHASH("tram-ta-ra-ram"): А> { А> ... А> } А>}
А>где MYHASH — макрос, который по сути делает со строкой то-же что и функция MyHash, но перед компиляцией, чтоб в case на момент компиляции уже были константы.
Я не знаю конкретной задачи, но у меня большинство "свичей" личились простым диспачером вроде:
"To protect people you must slay people. To let people live you must let people die. This is the true teaching of the sword."
-Seijuro Hiko, "Rurouni Kensin"