Вариадик темплейты
С того момента, как в сишарпе стали активно юзаться лямбды, часто встает вопрос о том, как написать метод, который в качестве одного из своих аргументов принимает любую лямбду. Проблема усложняется тем, что 1) есть написать просто Delegate, то компилер не сможет вывести тип лямбды и придется ее кастовать, что неудобно, 2) чтобы устранить недостатки подхода 1, нужно писать кучу оверлоадов (методов или классов), что является диким неудобством.
На выручку приходит концепция вариадик темплейтов - шаблонных методов и классов, которые принимают переменное число тайп-аргументов. К сожалению, ни в одном из релизных мейнстримных языков программирования ее нет. В ближайшем будущем поддержка увидит свет вместе со стандартом C++0x, но хз когда (впрочем, есть превьюшные компиляторы), а про языки .NET совсем непонятно (впрочем, тайп инференс в f# исключает многие ситуации, когда нужны вариадики). Вот неплохой документ с деталями: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2080.pdf.
Когда я обдумывал, как бы я сам делал такую штуку, мне было непонятно, как обращаться к элементам списка тайп-аргументов (например, в вариадик-методе может понадобиться использовать их, чтобы создать инстанс вариадик-класса или создать List из типов, а в вариадик-классе вдруг захочется объявить мемберы с использованием тайп-аргументов). Решение оказалось очень простым - рекурсия: обычная рекурсия для методов и рекурсивное наследование для классов. За подробностями милости прошу в документ, слинкованный выше.
На выручку приходит концепция вариадик темплейтов - шаблонных методов и классов, которые принимают переменное число тайп-аргументов. К сожалению, ни в одном из релизных мейнстримных языков программирования ее нет. В ближайшем будущем поддержка увидит свет вместе со стандартом C++0x, но хз когда (впрочем, есть превьюшные компиляторы), а про языки .NET совсем непонятно (впрочем, тайп инференс в f# исключает многие ситуации, когда нужны вариадики). Вот неплохой документ с деталями: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2080.pdf.
Когда я обдумывал, как бы я сам делал такую штуку, мне было непонятно, как обращаться к элементам списка тайп-аргументов (например, в вариадик-методе может понадобиться использовать их, чтобы создать инстанс вариадик-класса или создать List из типов, а в вариадик-классе вдруг захочется объявить мемберы с использованием тайп-аргументов). Решение оказалось очень простым - рекурсия: обычная рекурсия для методов и рекурсивное наследование для классов. За подробностями милости прошу в документ, слинкованный выше.