Minoru 23.11.2011 20:36 antaeus

Узнал сегодня об одной интересной штуке, которую сам автор назвал «calls table». Применяется она тогда, когда у нас есть некий union (который, есстественно, обёрнут в struct и сопровохжается флагом, указывающим на тип, причём значения флага принадлежат некому enum) и мы хотим по-разному обрабатывать его содержимое в зависимости от типа. Вобщем-то, самое очевидное решение — switch, но чувак пошёл другим путём: создал статический массив указателей на функции-обработчики так, что каждому элементу перечисления (ну, т.е. того enum, которым тип задаётся)
соответствует функция из массива обработчиков. Тогда в том месте, где должен был бы быть switch, пишется простенькая строка вида { f = (void*)functions_array[union_type]; f(args); }.
С одной стороны — костыль костылём, ибо switch вполне себе справился бы с задачей, но с другой… Что-то эллегантное в этом таки есть :)

1. utros 23.11.2011 20:37 eoranged

Я в одном из микроемаксоклонов такое не так давно видел. Взял на вооружение :)

2. Minoruutros /1 23.11.2011 20:39 antaeus

Оно мне полиморфизм напоминает. Имхо, оправдано только если «диспатчинг» нужен в нескольких местах — в противном случае switch подойдёт больше, как более традиционное решение.

3. dorfeMinoru /2 23.11.2011 20:57

Так и есть, это ООП средствами C без оверхедов и/или "магии" vtbl.

4. Minorudorfe /3 23.11.2011 20:59 antaeus

Тогда получается, что switch — это за'inline'ный диспатчинг. Бред же, ну :)

5. dorfeMinoru /4 23.11.2011 21:01

Почему бред, можно и километровые свитчи генерить, просто так удобнее :)

6. Minorudorfe /5 23.11.2011 21:02 antaeus

Ужас. А это всё — просто твой умовывод, или можешь подкрепить слова какими-нибудь ссылками?

7. dorfeMinoru /6 23.11.2011 21:07

Эм, какими ещё ссылками, на Дафф девайс? ;-) Вполе можно запилить хитрожопую внешнюю тулзу или макрос, генерящий эти свитчи, но это ужас, да.

8. Minorudorfe /7 23.11.2011 21:10 antaeus

Я не про switch, я про полиморфизм через массив функций. Думал, а вдруг ты знаешь, как его в настоящих ООП-языках делают.

9. jtootf 23.11.2011 21:11 galois

т.е. паттерн-матчинг по tagged union, считай ADT. не вижу повода давать этому отдельное имя, честно говоря

10. Minorujtootf /9 23.11.2011 21:12 antaeus

Ну, оно там в комментарии рядышком было, я не заявляю, что это общепризнанный термин или что-то вроде того.

11. dorfeMinoru /8 23.11.2011 21:12

В SmallTalk'е что ли? ;-)

Do you really want to delete ?