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 中。