2017-11-22 25 views
7

私は別の関数に引数として渡された関数を呼び出す必要があり、最初に必要な引数を渡さなければなりません。これは、出力をsould引数に渡された関数を、Dで既に与えられたパラメータで呼び出す方法は?

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

:C++のでは、この問題は、マクロで解決されて正確に、私はすべてのアイデアD.で関数を呼び出す必要があるか

> 72 
> Called! 

編集:私は、私のようなCALL内部の「foo」という呼びたい、これはD.で行う必要があり :

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

をしかし、私は、これはとおそらくD.で達成されるのか分かりません混入します?

+1

DかC++についての質問ですか? – YSC

+1

* "C++では、この問題はマクロ" *で解決されています。これは良い方法ではありませんが、テンプレートの方が優れています(構文は少し異なります)。 – Jarod42

+1

@YSC申し訳ありませんが、明確でない場合はDです。私はC++でどのようにしたかの例を示しています。 –

答えて

12

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'sのlazyパラメータ記憶クラスを使用すると、少し匿名関数にそれを与えるものは何でもラップするようにコンパイラーに指示します。上記はあなたが書いたかのようです:

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あなたが渡した隠れた関数の戻り値の型があります。 intが返された場合は、代わりにlazy intを使用できます。

CALL機能が隠された機能に書き換えている内xいるので、それを2回呼び出すと、実際には2回の引数を評価することに注意してください:

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 

お知らせどのように議論を2回印刷した。ちょうどCマクロのように。しかし、それがあなたが望むものではない場合は、単に一時的なものに割り当ててください:

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

それは私が探していたものです。ありがとうございました! –

関連する問題