On Thursday, 22 October 2015 at 02:35:34 UTC, rcorre wrote:

Come to think of it, SuperStruct actually sounds pretty similar to std.range.chooseAmong (which I just realized exists).

It seems to work quite nicely as an alternative to choose that works with any types as opposed to just ranges:

auto pick(T...)(size_t index, T values) {
  foreach(idx, val ; values)
    if (idx == index)
      return SuperStruct!T(val);

  assert(0, "index not in range of provided values");
}

/// `pick` is useful for something that is a floor wax _and_ a dessert topping:
unittest {
struct FloorWax { string itIs() { return "a floor wax!"; } } struct DessertTopping { string itIs() { return "a dessert topping!"; } }

  auto shimmer(bool hungry) {
    return pick(hungry, FloorWax(), DessertTopping());
  }

  assert(shimmer(false).itIs == "a floor wax!");
  assert(shimmer(true ).itIs == "a dessert topping!");
}

I can't think of a time I've wanted to do this with something _other_ than a range, but hey, its there.

Reply via email to