I have this: ```cpp
template <typename... T>
struct system {
using components_t = std::tuple<T...>;
}
template <typename... T>
struct query {}
template <typename S>
system_id create_system() {
return create_system<S>(std::make_index_sequence<std::tuple_size_v<typename S::components_t>> {});
}
template <typename S, size_t... I>
system_id create_system(std::index_sequence<I...>) {
using components_t = typename S::components_t;
static_assert(std::is_base_of_v<system<std::tuple_element_t<I, components_t>...>, S>, "system must derive from system");
auto query_instance = query<std::tuple_element_t<I, components_t>...>();
}```
I used chatGPT to get here, and it works, but it seems awkward, is there a better way of doing this? Do i really need to store the T... in a tuple? And use a helper function with index_sequence to create a new parameter pack from the tuple with I and tuple_element_t? I feel like there should be a more straightforward way...
