Video: Generic Programming Galore using D @ Strange Loop 2011

bearophile bearophileHUGS at lycos.com
Wed Apr 11 16:53:01 PDT 2012


Andrej Mitrovic:

> it just occurred to me that you can actually use a static 
> assert on a return type in D, e.g.:
>
> import std.traits;
> import std.algorithm;
>
> auto min(T1, T2)(T1 t1, T2 t2)
> {
>     return t1;  // e.g. implementation bug
>     static assert(is(typeof(return) == CommonType!(T1, T2)));
> }
>
> void main() {
>     auto x = min(1, 1.0);
> }
>
> I didn't know this until now.

I'd like to verify the type of what a range yields inside the 
post-condition of the function, but I can't use code like this, 
because currently functions with out{} can't use auto as return 
type:


import std.stdio, std.algorithm, std.traits;
auto foo(int x)
in {
     assert(x >= 0);
} out(result) {
     static assert(is(ForeachType!(typeof(result)) == int));
} body {
     return map!(a => a * 2)([1, 2, 3]);
}
void main() {
     writeln(foo(1));
}


And you have to keep in mind that inside the out{} 'result' is 
const, and const ranges aren't that useful, you can't even 
iterate them...

Bye,
bearophile


More information about the Digitalmars-d-announce mailing list