On Friday, 28 March 2014 at 22:12:02 UTC, H. S. Teoh wrote:
On Fri, Mar 28, 2014 at 10:44:11PM +0100, Artur Skawina wrote:
eg
        auto f(A...)(A args) {
                ...
                return cartesianProduct(x, y)
                        .joiner
                        .filter!(a=>somecondition?true:somefilter(a));
        }
[...]

It's not that simple, though. I guess I gave a bad example. In the actual code, someCondition decides whether or not a cartesian product is
even used. So the return range needs to somehow switch between a
cartesianProduct filtered by some filters, vs. an alternative algorithm
filtered by some other filters.


T

That would have been my solution too (though maybe using a delegate, to not re-evaluate "someconditon" per-element).

If both ranges are completely incompatible, then I'd either:
- array them into submission until they reach a single type.
- return both types, but have only 1 usable (eg, a tuple(type1, type2, index)), and let the caller worry about it.

Or alternativelly, do it pass by ref style:
alias Result1 = /+Define complicated alias1 here+/
alias Result2 = /+Define complicated alias2 here+/

size_t f(A...)(ref Result1 res1, ref Result2 res2, A args) {
                ...
                if (someCondition)
  {
                        res1 = cartesianProduct(x, y)
                                .joiner;
    return 0;
  }
                else
  {
                        res2 cartesianProduct(x, y)
                                .joiner
                                .filter!someFilter;
  return 1;
  }
}

I think this has the "advantage" of delegating the choice of how to merge the results: Take a single fork? Use an algebraic? Caller decides.

Reply via email to