Вопрос как всегда в том, что у нас дефолтный уровень и что мы эскейпим. Дефолтным уровнем всегда должно быть то, чего больше, что более по-существу важно при чтении. А это в зависимости от задачи может быть как метакод, так и рантаймкод. В теле макроса дефолтный уровень код макроса, а генерируемый код инклюдится в виде квазицитат. В темплейтах наоборот дефолтный уровень target-код, а метакод эскейпится словом static. Шош тут делать, разные задачи элегантнее делать по-разному. Ту, что ты привёл выше, темплейтами делать элегантнее. Естественно, тривиальные с точки зрения алгоритмики макросов задачи темплейтами делать кошерно и красиво
( ... )
Это все вопрос исключительно выразительности макросистемы. Если можно раскрываться в макросы и квазицитаты, то можно сделать альтернативные макро-объявления, в которых дефолтным уровнем будет уровень рантайма.
D не одним static if богат, там и "два вложенных цикла, да рекурсийка, да..." так же просто делаются. TypeTuple, раскрываемый в статике foreach по ним, рекурсивные шаблонные ф-ии и исполнение почти произвольного чистого кода при компиляции - это вам не старинные плюсовые темплейты.
однозначно д-шный подход лучше, т.к. это именно то, что я хотел бы сказать (написать)
ну или что почти то же самое - разница между макросом и static if это разница между грудой печатных плат и устройством, запакованным в корпус
можно чуть изменить формулировку - скажем, потребовать, чтобы MyRange(R) работала даже в том случае, если R *тоже* зависит от каких-то членов или методов MyRange(R) напрямую или через цепочку типов; при этом *в макросе* необходимо будет, например, производить топологическую сортировку и выявлять кольцевые зависимости (куча кода), однако синтаксис static if останется неизменным
Это частный случай. Для описания полиморфных контейнеров подход D более пригоден. Там уровень абстракции практически не меняется. А на других уровнях абстракции (например, получение кода из датасетов) уже понадобятся внешние генераторы кода или внутренние макросы с эффектами.
Впрочем, модификатор static здесь выглядит как масло масляное. Глобальные декларации и описания типов - они уже compile time. Вероятно, оставили для схожести с мета-включениями внутри функций, чтобы не смущать юных падаванов.
Comments 19
С точки зрения аматора Дишные шаблоны выглядят наглядней и аккуратней.
Reply
Reply
Reply
Reply
Reply
Reply
Reply
ну или что почти то же самое - разница между макросом и static if это разница между грудой печатных плат и устройством, запакованным в корпус
можно чуть изменить формулировку - скажем, потребовать, чтобы MyRange(R) работала даже в том случае, если R *тоже* зависит от каких-то членов или методов MyRange(R) напрямую или через цепочку типов; при этом *в макросе* необходимо будет, например, производить топологическую сортировку и выявлять кольцевые зависимости (куча кода), однако синтаксис static if останется неизменным
декларативность, короче
Reply
Впрочем, модификатор static здесь выглядит как масло масляное. Глобальные декларации и описания типов - они уже compile time. Вероятно, оставили для схожести с мета-включениями внутри функций, чтобы не смущать юных падаванов.
Reply
Leave a comment