2013-08-31 12 views
2

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

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; 

я могу каким-то образом использовать функции двойки для генерирует эти псевдонимы во время компиляции?

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

/Per

ответ

4

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

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()); 

Вообще, если вы сделаете evaluatable функцию времени компиляции, которая строит строку кода, вы можете подмешать (thatFunction (арг ...)); в какой-то момент и сделать это.

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

+0

Фантастический! Спасибо. –