Рассмотрим класс, содержащий карту компонентов, каждый из которых идентифицируется по своему типу, т.е. Component
уникален по своему типу.
std::map<std::type_index, Component*>
С использованием шаблонов и typeof
Я создал геттер для этих компонентов:
Physics *p = object.get<Physics>();
Я уже очень доволен этим, но есть ли способ использовать этот тип шаблона в качестве индексатора? Что-то вроде этого:
Physics *p = object[Physics];
Это, вероятно, лучшее, что вы можете достичь не прибегая к макросам или создание ненужных экземпляров:
int main()
{
map m;
m[type_w<int>] = /* ... */;
}
Реализация:
template <typename T>
struct type_wrapper { using type = T; };
template <typename T>
inline constexpr type_wrapper<T> type_w{};
struct map
{
template <typename T>
void operator[](type_wrapper<T>) { }
};
Physics
является типом, и поэтому вы не можете передать его функции (оператор является просто синтаксическим сахаром для функции). Что вы можете сделать, это передать экземпляр:
Physics *p = object[Physics{}]; // assuming Physics is default-constructible
Но если вы не можете создать Physics
Например, это решение не будет работать. Другое решение заключается в создании enum
и передайте это оператору:
enum class types {
Physics, SomethingElse
};
Physics *p = object[types::Physics];
Вместо того, чтобы использовать typeof
, вы должны сравнить значение types
перешел в функцию.