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

Cvoidポインターの配列をそれぞれの型(型がで定義されParameters、の長さがargumentsの長さに等しい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ただし、コンパイラが「コンパイル時に変数を読み取ることができない」と文句を言うため、これはコンパイルされません。何か案は?

4

1 に答える 1

3

これらの線に沿って何かをしてください:

ParameterTypeTuple!T args;

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

そしてあなたは始めるべきです

于 2012-11-14T02:02:39.953 に答える