2017-11-22 95 views
7

Başka bir işleve argüman olarak iletilen bir işlevi çağırmam gerekiyor ve önce gerekli argümanları geçmesi gerekiyor. Bu çıktıyı ruhBir işlev, D'de zaten verilen parametrelerle bağımsız değişken olarak nasıl çağrılır?

#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++, bu sorunun bir makro ile çözülür tam olarak herhangi bir fikir D'de fonksiyon çağırmak zorunda nasıl

> 72 
> Called! 

?

Düzenleme: Ben gibi CALL içinde "foo" aramak istediğiniz bu D'de yapılması gereken :

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

Ama bunun ile belki D'de elde edilir bilmiyorum mixin?

+1

D veya C++ ile ilgili bir soru mu var? – YSC

+1

* "In C++, bu sorun bir makroyla çözülür" *. Daha iyi bir yol değil, şablon yöntemi daha iyi (ama biraz farklı sözdizimi ile). – Jarod42

+1

@YSC Net olmasaydım özür dilerim, D ile ilgili. Sadece C++ 'da nasıl yaptığım hakkında bir örnek verdim. –

cevap

12

D'de bunun için lazy işlev parametresini kullanabilirsiniz.

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 parametre depolama sınıfı biraz anonim işlevinde verin ne olursa olsun sarmak için derleyici neden olur. Yukarıdaki gibi yazdınız:

Ancak derleyici sizin için yeniden yazar. Bu yüzden lazy void dedim - void ilettiğiniz gizli işlevin dönüş tipi var. int döndürdüyse, bunun yerine lazy int kullanabilirsiniz. CALL işlevi içinde x beri aslında iki kez argümanları değerlendirecek iki defa çağırarak, gizli bir fonksiyon olması için yeniden yazılan olduğunu

Not:

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

yapacağını:

before called 
3 5 
after called 
3 5 
after called again 

Bildirimi nasıl argümanları iki kez basmış. Aslında C makrosu gibi. Ama eğer istediğin buysa, bunu geçici olarak kendin atayın:

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

Aradığım şey buydu. Teşekkür ederim! –

İlgili konular