如何调用作为参数传递的函数,其参数已在 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
}
我需要调用一个作为参数传递给另一个函数的函数,并且必须首先将其所需的参数传递给它。在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
}