#include <tuple>
#include <vector>
template<class Type>
struct Pool {
std::vector<Type> components;
};
template<class... Types>
class Storage {
public:
std::tuple<Pool<Types>...> pools;
template<class SelectedType0, class... SelectedTypes>
std::tuple<std::vector<SelectedTypes>&...> getVectorsFromTuple();
template<class... SelectedTypes>
void iterate();
};
template<class... Types>
template<class SelectedType0, class... SelectedTypes>
std::tuple<std::vector<SelectedTypes>&...> Storage<Types...>::getVectorsFromTuple() {
return {};
}
template<class... Types>
template<class... SelectedTypes>
void Storage<Types...>::iterate() {
std::tuple<std::vector<SelectedTypes>&...> vectors = getVectorsFromTuple<SelectedTypes...>();
// getVectorsFromTuple should get the values in the tuple based on types
// and save reference to each tuple item's structure's `components`
// property in another tuple
}
struct IntComponent {
int integer;
};
struct FloatComponent {
float real;
};
int main() {
Storage<IntComponent, FloatComponent> storage;
// This function currently gives an error
// due to unimplemented `getVectorsFromTuple`
// storage.iterate<IntComponent>();
return 0;
}
I2luY2x1ZGUgPHR1cGxlPgojaW5jbHVkZSA8dmVjdG9yPgoKdGVtcGxhdGU8Y2xhc3MgVHlwZT4Kc3RydWN0IFBvb2wgewogIHN0ZDo6dmVjdG9yPFR5cGU+IGNvbXBvbmVudHM7Cn07Cgp0ZW1wbGF0ZTxjbGFzcy4uLiBUeXBlcz4KY2xhc3MgU3RvcmFnZSB7CnB1YmxpYzoKICBzdGQ6OnR1cGxlPFBvb2w8VHlwZXM+Li4uPiBwb29sczsKCiAgdGVtcGxhdGU8Y2xhc3MgU2VsZWN0ZWRUeXBlMCwgY2xhc3MuLi4gU2VsZWN0ZWRUeXBlcz4KICBzdGQ6OnR1cGxlPHN0ZDo6dmVjdG9yPFNlbGVjdGVkVHlwZXM+Ji4uLj4gZ2V0VmVjdG9yc0Zyb21UdXBsZSgpOwoKICB0ZW1wbGF0ZTxjbGFzcy4uLiBTZWxlY3RlZFR5cGVzPgogIHZvaWQgaXRlcmF0ZSgpOwp9OwoKdGVtcGxhdGU8Y2xhc3MuLi4gVHlwZXM+CnRlbXBsYXRlPGNsYXNzIFNlbGVjdGVkVHlwZTAsIGNsYXNzLi4uIFNlbGVjdGVkVHlwZXM+CiAgc3RkOjp0dXBsZTxzdGQ6OnZlY3RvcjxTZWxlY3RlZFR5cGVzPiYuLi4+IFN0b3JhZ2U8VHlwZXMuLi4+OjpnZXRWZWN0b3JzRnJvbVR1cGxlKCkgewogIAlyZXR1cm4ge307Cn0KCnRlbXBsYXRlPGNsYXNzLi4uIFR5cGVzPgp0ZW1wbGF0ZTxjbGFzcy4uLiBTZWxlY3RlZFR5cGVzPgp2b2lkIFN0b3JhZ2U8VHlwZXMuLi4+OjppdGVyYXRlKCkgewogIHN0ZDo6dHVwbGU8c3RkOjp2ZWN0b3I8U2VsZWN0ZWRUeXBlcz4mLi4uPiB2ZWN0b3JzID0gZ2V0VmVjdG9yc0Zyb21UdXBsZTxTZWxlY3RlZFR5cGVzLi4uPigpOwogIC8vIGdldFZlY3RvcnNGcm9tVHVwbGUgc2hvdWxkIGdldCB0aGUgdmFsdWVzIGluIHRoZSB0dXBsZSBiYXNlZCBvbiB0eXBlcwogIC8vIGFuZCBzYXZlIHJlZmVyZW5jZSB0byBlYWNoIHR1cGxlIGl0ZW0ncyBzdHJ1Y3R1cmUncyBgY29tcG9uZW50c2AKICAvLyBwcm9wZXJ0eSBpbiBhbm90aGVyIHR1cGxlIAp9CgpzdHJ1Y3QgSW50Q29tcG9uZW50IHsKCWludCBpbnRlZ2VyOwp9OwoKc3RydWN0IEZsb2F0Q29tcG9uZW50IHsKCWZsb2F0IHJlYWw7Cn07CgppbnQgbWFpbigpIHsKCVN0b3JhZ2U8SW50Q29tcG9uZW50LCBGbG9hdENvbXBvbmVudD4gc3RvcmFnZTsKCS8vIFRoaXMgZnVuY3Rpb24gY3VycmVudGx5IGdpdmVzIGFuIGVycm9yCgkvLyBkdWUgdG8gdW5pbXBsZW1lbnRlZCBgZ2V0VmVjdG9yc0Zyb21UdXBsZWAKCS8vIHN0b3JhZ2UuaXRlcmF0ZTxJbnRDb21wb25lbnQ+KCk7CglyZXR1cm4gMDsJCn0=