Dlang / 将参数传递给委托
Dlang / Passing arguments to delegates
我希望能够存储一个函数,以便稍后使用可变数量的参数执行。我通过将委托包装在 class 中来完成此操作。传递参数以执行委托时,永远不会收到参数。这种行为的本质是什么,我怎样才能让委托接收参数来执行它们?
import std.variant;
import std.stdio;
class Callback
{
bool delegate(...) callback;
Variant[] params;
this(T)(T t)
{
this.callback = cast(bool delegate(...)) t;
}
this(T, A...)(T t, A a)
{
this.callback = cast(bool delegate(...)) t;
foreach(item;a)
{
Variant temp = item;
this.params ~= temp;
}
}
void exec()
{
if(this.params.length)
{
writeln("Passed args: ");
writeln(this.params);
callback(this.params);
}
else
{
callback();
}
}
}
void main()
{
bool test()
{
writeln("Executing first test");
return false;
}
bool test2(Variant[] params)
{
writeln("Received args: ");
writeln(params);
return false;
}
Callback cb = new Callback(&test);
cb.exec();
writeln();
Callback cb2 = new Callback(&test2, "test2 executing", 1);
cb2.exec();
}
C:\Users\Nulrie\Documents\D>test
Executing first test
Passed args:
[test2 executing, 1]
Received args:
[]
C:\Users\Nulrie\Documents\D>
您在构造函数中的转换无效。您不能将任何函数强制转换为 (...)
,因为在幕后传递参数的方式非常不同。在 Linux,你的代码实际上是段错误。
如果您希望存储委托,并且对使用 GC 感到满意,只需使用委托:
import std.variant;
import std.stdio;
void main()
{
bool test()
{
writeln("Executing first test");
return false;
}
bool test2(Variant[] params)
{
writeln("Received args: ");
writeln(params);
return false;
}
auto cb = () => test();
cb();
writeln();
auto cb2 = () => test2([Variant("test2 executing"), Variant(1)]);
cb2();
}
您有一些变体,例如(...) { /* something */ }
将允许您接受任意参数,但无论如何您都需要将它们包装在 Variant
中。
我希望能够存储一个函数,以便稍后使用可变数量的参数执行。我通过将委托包装在 class 中来完成此操作。传递参数以执行委托时,永远不会收到参数。这种行为的本质是什么,我怎样才能让委托接收参数来执行它们?
import std.variant;
import std.stdio;
class Callback
{
bool delegate(...) callback;
Variant[] params;
this(T)(T t)
{
this.callback = cast(bool delegate(...)) t;
}
this(T, A...)(T t, A a)
{
this.callback = cast(bool delegate(...)) t;
foreach(item;a)
{
Variant temp = item;
this.params ~= temp;
}
}
void exec()
{
if(this.params.length)
{
writeln("Passed args: ");
writeln(this.params);
callback(this.params);
}
else
{
callback();
}
}
}
void main()
{
bool test()
{
writeln("Executing first test");
return false;
}
bool test2(Variant[] params)
{
writeln("Received args: ");
writeln(params);
return false;
}
Callback cb = new Callback(&test);
cb.exec();
writeln();
Callback cb2 = new Callback(&test2, "test2 executing", 1);
cb2.exec();
}
C:\Users\Nulrie\Documents\D>test
Executing first test
Passed args:
[test2 executing, 1]
Received args:
[]
C:\Users\Nulrie\Documents\D>
您在构造函数中的转换无效。您不能将任何函数强制转换为 (...)
,因为在幕后传递参数的方式非常不同。在 Linux,你的代码实际上是段错误。
如果您希望存储委托,并且对使用 GC 感到满意,只需使用委托:
import std.variant;
import std.stdio;
void main()
{
bool test()
{
writeln("Executing first test");
return false;
}
bool test2(Variant[] params)
{
writeln("Received args: ");
writeln(params);
return false;
}
auto cb = () => test();
cb();
writeln();
auto cb2 = () => test2([Variant("test2 executing"), Variant(1)]);
cb2();
}
您有一些变体,例如(...) { /* something */ }
将允许您接受任意参数,但无论如何您都需要将它们包装在 Variant
中。