On 08/03/2013 12:19 AM, Andrei Alexandrescu wrote:
On 8/2/13 3:17 PM, Timon Gehr wrote:
On 08/03/2013 12:06 AM, Andrej Mitrovic wrote:
On 8/2/13, Andrei Alexandrescu <seewebsiteforem...@erdani.org> wrote:
auto fun(auto x, auto y) { … }

Truth be told, at the time of that decision
parameter names (viz. x and y) could not be used in template
constraints. Now they could, so in a way that reopens the question.

You'd still have to use typeof(x) and typeof(y) to extract the types,
so even though you end up making the template declaration simpler you
also make the constraint more complicated.
...

bool compare(a,b) if(__traits(compiles,a<b)) { return a<b; }

Direct use of __traits is unrecommended outside the stdlib.

The language is not expressive enough to wrap __traits(compiles,a<b) in the stdlib.

I had this pattern in mind:

bool compare(auto a, auto b) if (is(typeof(a < b) : bool)) { ... }
...

Checking for implicit conversion to bool is redundant due to how operator overloading is handled for '<'.

Furthermore, this constraint is not sufficient.


bool compare(A,B)(A a,B b) if (is(typeof(a < b) : bool)){
    return a<b;
}

void main(){
    int o(T)(T r){ return 0; }
    static struct S{
        alias o opCmp;
    }
    compare(S(),S()); // causes error in template body
}

DMD's implementation of __traits(compiles,...) currently shares this issue; this is a compiler bug as far as I can tell. The above behaviour is to be expected for is(typeof(.)) though.

Reply via email to