On Saturday, 29 April 2017 at 05:58:35 UTC, Stanislav Blinov wrote:
On Friday, 28 April 2017 at 20:43:50 UTC, Alex wrote:

void main()
{
    foreach(o1; __traits(getOverloads, S1, "opCall"))
    {
        alias P1 = Parameters!o1;
        foreach(o2; __traits(getOverloads, S2, "opCall"))
        {
            alias P2 = Parameters!o2;
            static if (is(P1 == P2))
            {
                pragma(msg, "Matching params: "~P1.stringof);
            }
        }
    }
}

The problem is another one: say I have something like this:

import std.traits;

struct A(alias T) if(isCallable!T)
{       
auto opCall(U...)(U args) if(is(Parameters!T == U)) //if(__traits(compiles, T(args)))
        {
                return T(args);
        }
}

void main()
{
        S s;
        A!s c;
        assert(c(4) == 42);
}

struct S
{
        auto opCall(){ return 42; }
        auto opCall(int i){return 42; }
}

This doesn't work because of Parameters trait and the both opCalls defined.
However, I see the point...
If I take the compiles-trait, it works as expected:
In this case the constrained is fulfilled, and with the second opCall commented out - it isn't.

Thanks :)

Reply via email to