I have several structs, and I want to create an array of them so that I can use its members as an argument for a template, something like types = {int, float}; multiply<types[i]>();. It can be done through overloading, but I have lots of functions so this is not a way. As far as I know, we can store types only as pointers (so I'll actually have to dereference it: multiply<*types[i]>();), but here I stop to understand because to create a pointer I have to know type of variable it's pointing to, and what is a type of a class (of a type)? I thought "screw it, I'll use auto", but then it seems to be that pointers to different classes are of different types, so that I have to erase their type to store them in a common array, and so on, I have this now:
auto types = {std::make_shared<void>(Student), std::make_shared<void>(Citizen)};
And it says that Student and Citizen don't refer to a value.