2012-11-14 39 views
1

如果我有一個類如下述:轉換無效*的參數數組靜態類型

import std.traits; 

class Test(T) if(isCallable!T) 
{ 
alias ParameterTypeTuple!T Parameters; 
alias ReturnType!T delegate(Parameters) DelegateType; 

DelegateType m_delegate; 

void Foo(void ** arguments) 
{ 
    // I want to convert the void* array to 
    // the respective type of each argument 
    m_delegate(arguments); 
} 
} 

如何可以轉換C陣列空指針的各自的類型(其中,其類型是在限定的Parametersarguments的長度等於Parameters的長度),然後調用函數?

我試圖做到這一點使用一個元組像下面這樣:

void Foo(void ** arguments) 
{ 
Tuple!(Parameters) tuple; 

foreach(index; 0 .. Parameters.length) 
{ 
    // Copy each value to the tuple 
    tuple[index] = *(cast(Parameters[index]*) arguments[index]); 
} 

// Call the function using the tuple (since it expands to an argument list) 
m_delegate(tuple); 
} 

但是,這並不編譯,因爲編譯器抱怨「變量index不能在編譯時讀」。有任何想法嗎?

回答

3

做一些沿着這些路線:

ParameterTypeTuple!T args; 

foreach(i, arg; args) { 
    args[i] = cast(typeof(arg)) arguments[i]; 
} 

,你應該開始

+1

或間接引用指針或什麼的。關鍵是要對參數元組本身進行foreach,因爲那時索引變量將在編譯時可用。 –

+0

你會遇到大小爲args的問題:'void'有'sizeof = 1',所以如果你用'int'(用'sizeof = 4')做這個事情,你會遇到麻煩 –

+0

Pointers指向無效的指針都是相同的大小。 – BCS