C++ Macro to D mixin template, delegates Please help
    Regan Heath 
    regan at netmail.co.nz
       
    Fri Sep 21 02:44:45 PDT 2007
    
    
  
BLS wrote:
> Regan Heath schrieb:
>> Henning Hasemann wrote:
I don't understand.  What doesn't the code Henning posted do, that you 
need it to do??
class Foo {
   void foo() {
     writefln("foo called");
   }
   void bar() {
     writefln("bar called");
   }
   mixin MessageMap!(
     OnClose!(foo),
     OnRange!(1, 3, bar)
   );
}
expands to:
class Foo {
   void foo() {
     writefln("foo called");
   }
   void bar() {
     writefln("bar called");
   }
   void newMsgProc(uint uID) {      //expands just like "BEGIN_MSG_MAP"
      foreach(mapping; Mappings) {  //loops 2x
        if(mapping.matches(uID))    //just like "if (uID == WM_CLOSE)"
          mapping.executeAction();  //just like "vfunc();"
      }
   }
}
Change MessageMap to expand to the function fignature you want, i.e.
template MessageMap(Mappings ...) {
   override BOOL NewMsgProc(HWND hWnd, UINT uID, WPARAM wParam, LPARAM 
lParam, ref LRESULT lResult) {
      foreach(mapping; Mappings) {
        if(mapping.matches(uID))
          mapping.executeAction();
      }
   }
}
Change MessageMap to return the result of the mapping.executeAction just 
like "return lResult;" in the original C++.
template MessageMap(Mappings ...) {
   override BOOL NewMsgProc(HWND hWnd, UINT uID, WPARAM wParam, LPARAM 
lParam, ref LRESULT lResult) {
      foreach(mapping; Mappings) {
        if(mapping.matches(uID)) {
          lResult = mapping.executeAction();
          return cast(BOOL)lResult;
        }
      }
   }
}
I think it's ok to use mixins as you're desribing, but why do you need 
to do it that way?
Regan
    
    
More information about the Digitalmars-d-learn
mailing list