lambdas with types

Paul Backus snarwin at gmail.com
Fri Nov 20 14:47:52 UTC 2020


On Friday, 20 November 2020 at 14:08:23 UTC, jmh530 wrote:
> Doing something like below fails because I don't seem to be 
> able to make a templated lambda that just takes types. Is the 
> only way to do something similar to create a separate function 
> to handle the condition, or is there some other way to do 
> something with similar flexibility?
>
> import std.stdio: writeln;
> import std.meta: allSatisfy;
>
> void foo(Args...)(Args args)
>     if (allSatisfy!(x => is(x == double), Args))
> {
>     writeln("works");
> }
>
> void main() {
>     foo(1.0, 2.0);
> }

There is no way to create an anonymous template in D. You will 
have to declare a separate helper template:

     private enum isDouble(T) = is(T == double);

     void foo(Args...)(Args args)
         if (allSatisfy!(isDouble, Args))
     {
         // ...
     }

In this specific case, you could also make `foo` a type-safe 
variadic function [1], which would eliminate the need for 
`allSatisfy`:

     void foo(double[] args...)
     {
         // ...
     }

[1] 
https://dlang.org/spec/function.html#typesafe_variadic_functions


More information about the Digitalmars-d-learn mailing list