Использование CTFE для генерации множества псевдонимов структур

Скажи у меня класс

struct Vector (ElementType, uint Dimension) { ... }

представляя фиксированный размерный вектор вместе с этими сокращениями

alias Vector!(float, 2) vec2;
alias Vector!(float, 3) vec3;
alias Vector!(float, 4) vec4;
alias Vector!(double, 2) vec2d;
alias Vector!(double, 3) vec3d;
alias Vector!(double, 4) vec4d;
alias Vector!(int, 2) vec2i;
alias Vector!(int, 3) vec3i;
alias Vector!(int, 4) vec4i;

могу ли я как-то использовать возможности D для генерации этих псевдонимов во время компиляции?

Или это только для оценки функций?

/ Пер

1 ответ

Решение

Вы всегда можете сделать это как миксин.

string makeAliases() {
   string code;
   import std.conv;

   foreach(type; ["float", "double", "int"])
   foreach(n; 2 .. 5)
      code ~= "alias Vector!("~type~", " ~ to!string(n) ~ ") vec" ~   to!string(n) ~ type[0] ~ ";\n";

  return code;
}

mixin(makeAliases());

Как правило, если вы создаете вычисляемую во время компиляции функцию, которая создает строку кода, вы можете затем mixin(thatFunction(args...)); в какой-то момент и сделать это.

При отладке функции вы можете просто запустить ее во время выполнения и написать (thatFunction ()), чтобы увидеть, какой код она генерирует.

Другие вопросы по тегам