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