On Friday, 3 August 2018 at 19:10:45 UTC, Hakan Aras wrote:
I don't think you can distinguish between entities evaluated through different templates. TemplateOf will paradoxically not work on pure templates of the form "template X() {}" only things like template functions and template structs. isSame, is, and isInstanceOf will only work on the fully evaluated type or alias (pred) not the template that was used to evaluate it.

If I understood your usecase correctly, you could do something like this though:

https://run.dlang.io/is/VwZoAx

That is use an enum as a template parameter instead of wrapping the predicate in a template.

You did understand and yep that'd work as well! I was not too happy about the extra parameter though and it'd be nice to have the information in the type. But I think I figured it out:

struct eq(alias _pred) {
    alias pred = _pred;
}

struct lt(alias _pred) {
    alias pred = _pred;
}

void main() {
    import std.stdio: writeln;

    static struct S(alias pred) {
        auto f(int a, int b) {
            static if (is(pred : eq!p, p...)) {
                return p[0](a, b);
            } else static if (is(pred : lt!p, p...)) {
                return !p[0](a, b) && !p[0](b, a);
            } else {
                import std.functional: binaryFun;
                return binaryFun!pred(a, b);
            }
        }
    }

    alias a = eq!((a, b) => a == b);
    alias b = lt!((a, b) => a < b);

    S!(a)().f(1, 1).writeln;
    S!(b)().f(1, 1).writeln;
    S!"a == b"().f(1, 1).writeln;
}

Reply via email to