Узнал сегодня об одной интересной штуке, которую сам автор назвал «calls table». Применяется она тогда, когда у нас есть некий union (который, есстественно, обёрнут в struct и сопровохжается флагом, указывающим на тип, причём значения флага принадлежат некому enum) и мы хотим по-разному обрабатывать его содержимое в зависимости от типа. Вобщем-то, самое очевидное решение — switch, но чувак пошёл другим путём: создал статический массив указателей на функции-обработчики так, что каждому элементу перечисления (ну, т.е. того enum, которым тип задаётся)
соответствует функция из массива обработчиков. Тогда в том месте, где должен был бы быть switch, пишется простенькая строка вида { f = (void*)functions_array[union_type]; f(args); }.
С одной стороны — костыль костылём, ибо switch вполне себе справился бы с задачей, но с другой… Что-то эллегантное в этом таки есть :)
Minoru
23.11.2011 20:36 antaeus
Do you really want to delete ?
Я в одном из микроемаксоклонов такое не так давно видел. Взял на вооружение :)
Оно мне полиморфизм напоминает. Имхо, оправдано только если «диспатчинг» нужен в нескольких местах — в противном случае switch подойдёт больше, как более традиционное решение.
Так и есть, это ООП средствами C без оверхедов и/или "магии" vtbl.
Тогда получается, что switch — это за'inline'ный диспатчинг. Бред же, ну :)
Почему бред, можно и километровые свитчи генерить, просто так удобнее :)
Ужас. А это всё — просто твой умовывод, или можешь подкрепить слова какими-нибудь ссылками?
Эм, какими ещё ссылками, на Дафф девайс? ;-) Вполе можно запилить хитрожопую внешнюю тулзу или макрос, генерящий эти свитчи, но это ужас, да.
Я не про switch, я про полиморфизм через массив функций. Думал, а вдруг ты знаешь, как его в настоящих ООП-языках делают.
т.е. паттерн-матчинг по tagged union, считай ADT. не вижу повода давать этому отдельное имя, честно говоря
Ну, оно там в комментарии рядышком было, я не заявляю, что это общепризнанный термин или что-то вроде того.
В SmallTalk'е что ли? ;-)