Call method if declared only
    mipri 
    mipri at minimaltype.com
       
    Fri Feb 28 08:36:53 UTC 2020
    
    
  
On Friday, 28 February 2020 at 08:08:59 UTC, Виталий Фадеев wrote:
> Searching for beauty readable code...
The pattern throughout Phobos is static tests, like isInputRange!R
So something like this:
   import std.stdio;
   import std.traits;
   template canOnKey(T) {
       static if (__traits(hasMember, T, "onKey"))
           enum canOnKey = isCallable!(__traits(getMember, T, 
"onKey"));
       else
           enum canOnKey = false;
   }
   struct A { void onKey() { writeln("called A"); } }
   struct B { }
   struct C { bool onKey = false; }
   void maybeKey(T)(T o) if (canOnKey!T) {
       o.onKey();
   }
   void maybeKey(T)(T o) if (!canOnKey!T) { }
   void main() {
       auto a = A(), b = B(), c = C();
       maybeKey(a);
       maybeKey(b);
       maybeKey(c);
   }
output:
   called A
(and no other output)
Of course in this exact instance it would be simpler to write
   void maybeKey(T)(T o) {
       static if (canOnKey!T)
           o.onKey();
   }
And rather than lots of specific hasThisExactMethod!T tests, it
might be nice if in your actual program there's a 'class' of
grouped properties that you can test for all at once, again
like isInputRange!T and friends.
    
    
More information about the Digitalmars-d-learn
mailing list