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



Reply via email to