2011-11-18 88 views
3

D2.056D編譯時函數類型提取

函數是一個包含名稱和函數類型(分別爲Name和Type)的結構。綁定迭代函數結構列表並返回一個mixin字符串。這個mixin爲每個函數定義了一個新名字,並附加了'2'。

void f() { writeln("f"); } 
void g() { writeln("g"); } 

struct Function(string name, Prototype) 
{ 
    const string Name = name; 
    mixin("alias Prototype Type;"); 
} 

string Binds(Functions...)() 
{ 
    string r; 
    foreach (F; Functions) 
    { 
     // error: 
     r ~= to!string(typeid(F.Type)) ~ " " ~ F.Name ~ "2 = &" ~ F.Name ~ ";"; 
    } 
    return r; 
} 

int main() 
{ 
    mixin (Binds!(
       Function!("f", void function()), 
       Function!("g", void function())   
       )); 

    f(); 
    //f2(); 

    return 0; 
} 

編譯時,該to!string(typeid(F.Type))給出了一個錯誤:

Error: Cannot interpret & D13TypeInfo_PFZv6__initZ at compile time 
    called from here: to(& D13TypeInfo_PFZv6__initZ) 
    called from here: Binds() 

首先,我不明白爲什麼需要顯式地轉換爲字符串(尚未typeid的一個字符串,如果沒有, typeid和typeof有什麼區別?)。

其次,我不知道如何獲得顯式函數類型寫出來,以便它可以在主要執行。我不能使用F.Type,因爲它是本地的foreach。

回答

2

這裏有幾個問題,但主要的是typeid返回TypeInfo類型的對象(typeid expression)。幸運的是,你可以使用F.Type.stringof。還要注意的是,你不需要混入到別名原型類型:

void f() { writeln("f"); } 
void g() { writeln("g"); } 

struct Function(string name, Prototype) 
{ 
    const string Name = name; 
    alias Prototype Type; 
} 

string Binds(Functions...)() 
{ 
    string r; 
    foreach (F; Functions) 
    { 
     // error: 
     r ~= F.Type.stringof ~ " " ~ F.Name ~ "2 = &" ~ F.Name ~ ";"; 
    } 
    return r; 
} 

import std.stdio, 
    std.conv; 
int main() 
{ 
    mixin (Binds!(
       Function!("f", void function()), 
       Function!("g", void function())   
       )); 

    f(); 
    f2(); 

    return 0; 
} 

運行此版畫:

f 
f 

我相信這是你在找什麼。