Call method if declared only

Виталий Фадеев vital.fadeev at gmail.com
Fri Feb 28 10:33:11 UTC 2020


On Friday, 28 February 2020 at 10:20:03 UTC, Виталий Фадеев wrote:
> On Friday, 28 February 2020 at 10:14:41 UTC, Виталий Фадеев 
> wrote:
>> On Friday, 28 February 2020 at 09:49:53 UTC, Simen Kjærås 
>> wrote:
>>> On Friday, 28 February 2020 at 09:25:58 UTC, Виталий Фадеев 
>>> wrote:
>>>> [...]
>>>
>>> So let's create a template for that:
>>>
>>> [...]
>>
>> Cool!
>
> Think!
> I writing code generation. Like this:
>
> void On( T, alias M )( T o )
> {
>     // generate code in dispatcher
>     // get AllMembers()
>     //   filter OnABC (ex: OnWM_KEYUP)
>     //   on each
>     //   writeCode(
>     //     q{
>     //        if ( message == WM_KEYUP )
>     //           o.OnWM_KEYUP();
>     //      }
>     //   );
>
>     static ... foreach(  ) ...
>     {
>         CB_MESSAGE = ...
>         CB_METHOD  = ...
>
>         mixin (
>             "if ( message == CB_MESSAGE ) " ~ "o." ~ CB_METHOD 
> ~ "();"
>         );
>     }
> }

Thanks all !
I happy !
Check this one:

     import core.sys.windows.windows;
     import std.stdio;
     import std.traits;
     import std.algorithm.searching;


     void On( T, M )( T o, M message )
     {
         // generate code in dispatcher
         // get AllMembers()
         //   filter OnABC (ex: OnWM_KEYUP)
         //   on each
         //   writeCode(
         //     q{
         //        if ( message == WM_KEYUP )
         //           o.OnWM_KEYUP();
         //      }
         //   );

         foreach( methodName; __traits( allMembers, T ) )
         {
             static if ( methodName.startsWith( "On" ) && 
methodName.length >= 3 )
             {
                 mixin (
                     "if ( message == " ~ methodName[2..$] ~ " ) " 
~ "o." ~ methodName ~ "();"
                 );
             }
         }
     }


     class Base
     {
         void Send( T, M )( T o, M message )
         {
             o.On!( T, M )( message );
         }
     }

     class A : Base
     {
         void OnWM_KEYUP()
         {
             writeln( "A.OnWM_KEYUP()" );
         }

         void OnWM_KEYDOWN()
         {
             writeln( "A.OnWM_KEYDOWN()" );
         }
     }


     void main()
     {
         auto a = new A();
         a.Send( a, WM_KEYUP );
         a.Send( a, WM_KEYDOWN );
     }





More information about the Digitalmars-d-learn mailing list