template <typename TArgs, typename UArgs>
    Aggregate(TArgs t_args, UArgs u_args)
      : t{std::move(t_args).construct()}, u{std::move(u_args).construct()}
    {}

    T const &get_t() const { return t; }
    U const &get_u() const { return u; }

  private:
    T t;
    U u;
  };
}

SCENARIO("basic aggregate") {
  GIVEN("an aggregate type constructed with rvalue tuples") {
    Aggregate<A, B> aggregate{
      mp::builder(mp::construct<A>, "foo", 33)
    , mp::builder(mp::braced_construct<B>, 42, "bar", 77)
    };

    THEN("piecewise construction works") {
      REQUIRE(aggregate.get_t().get_thirty_three() == 33);
      REQUIRE(aggregate.get_t().get_foo() == "foo");
      REQUIRE(aggregate.get_u().forty_two == 42);
      REQUIRE(aggregate.get_u().bar == "bar");
      REQUIRE(aggregate.get_u().seventy_seven == 77);
    }
  }
}