0
我寫這一段代碼來獲得由指針傳遞的各類功能的保持:foreach在編譯時執行嗎?
import std.stdio;
import std.traits;
void main()
{
get_param_types(&f1,"f1");
get_param_types(&f2,"f2");
get_param_types(&f3,"f3");
}
void get_param_types(f_t)(f_t f, string f_id){
writeln("get_param_types ");
alias ParameterTypeTuple!(f) ptt;
writeln(f_id, " has ", ptt.length, " parameters");
static if (ptt.length){
write("(");
foreach (pt; ptt){
write(typeid(pt), " ");
}
writeln(")");
}
}
void f1() { }
void f2(int x) { }
void f3(int x, double y, string z) { }
我的疑問是:1:get_param_types
完全在編譯時評價?
如果不是:2:我該如何做到這一點?
雖然我在這... 3:是否有辦法避免將字符串(例如"f1"
),並在編譯時從get_param_types
內演繹呢?
「寫入」調用僅用於調試。所以,如果我擺脫它們(或者'調試'它們,我將編輯這個帖子)它將在編譯時執行,對吧?我確信'靜'如果不是'foreach'。 'alias''stringof' combi的作品像魅力! isCallable是什麼?據我可以看到,它只是縮短了錯誤消息,當我調用一個不可調用的函數... – steffen
foreach()將在迭代元組時迭代在編譯時展開。也就是說,在運行時不會有迭代,它只是一個語句列表。 isCallable指定別名必須是可以調用的東西(具有opCall()的函數,委託,結構或類)。它往往會使用法和錯誤信息更清晰。 – Robert