如何调用作为参数传递的函数,其参数已在 D 中给出?

how to call a function passed as argument with its parameters already given in D?

我需要调用一个作为参数传递给另一个函数的函数,并且必须首先将其所需的参数传递给它。在c++中,这个问题是用一个宏来解决的:

#include <iostream>

#define CALL(x) x; \
                std::cout << "Called!" << std::endl;

void foo(int a, int b)
{
    std::cout << a * b << std::endl;
}

int main()
{
    CALL(foo(9, 8)); // I want to pass 2 int parameters inside 'foo' function call
    system("PAUSE");
}

它应该输出:

> 72
> Called!

这正是我需要在 D 中调用函数的方式。有什么想法吗?

编辑: 我需要在 D 中完成此操作。我想在 CALL 中调用 "foo",例如:

CALL(foo(9, 8)) // and not like: CALL(foo, 9, 8)

但我不知道这在 D 中是如何实现的。也许使用 mixin?

在 D 中,您可以为此使用 lazy 函数参数。

import std.stdio;

void CALL(lazy void x) {
        writeln("before called");
        x;
        writeln("after called");
}

void foo(int x, int y) {
        writeln(x, " ", y);
}

void main() {
        CALL(foo(3, 5));
}

D 的 lazy 参数存储 class 导致编译器将您提供的任何内容包装在一个小的匿名函数中。以上就是你写的:

import std.stdio;

void CALL(void delegate() x) { // note delegate here in long-form syntax
        writeln("before called");
        x();
        writeln("after called");
}

void foo(int x, int y) {
        writeln(x, " ", y);
}

void main() {
        // and this delegate too
        CALL( delegate() { return foo(3, 5); } );
}

但是编译器会为你重写它。这就是为什么我说 lazy void - void 是你传递的隐藏函数的 return 类型。如果它 returned int,你可以使用 lazy int 代替。

请注意,由于 CALL 函数中的 x 被重写为隐藏函数,调用它两次实际上会计算参数两次:

void CALL(lazy void x) {
        writeln("before called");
        x;
        writeln("after called");
        x;
        writeln("after called again");
}

会做:

before called
3 5
after called
3 5
after called again

注意它是如何将参数打印两次的。实际上,就像 C 宏一样。但如果这不是您想要的,只需将其分配给您自己的临时文件即可:

void CALL(lazy int x) {
    auto tmp = x;
    // you can now use tmp as a plain int
}