Ok, so I now have this, but I think maybe the switch could be turned into a static array by an reinterpret cast of "&expand[0]"? I would assume the layout would typically be "expand_field_0, expand_field_1 etc...

template Tuple(Types...){
    template same(){
        static foreach (i, dummy; Types) {
static if (i + 1 < Types.length && !is(typeof(same) == bool)
                       && !is(Types[i] == Types[i + 1])) {
                enum bool same = false;
            }
        }
        static if (!is(typeof(same) == bool)) {
            enum bool same = true;
        }
    }

    struct Tuple {
        Types expand;
        alias expand this;

        static if (same!()) {
            auto opIndex(size_t i) {
                switch (i) {
                    static foreach (j; 0 .. Types.length) {
                        case j: return this.expand[j];
                    }
                    default: assert(0);
                }
            }
        }
    }
}


Reply via email to