Использование типа в качестве индексатора

Рассмотрим класс, содержащий карту компонентов, каждый из которых идентифицируется по своему типу, т.е. Component уникален по своему типу.

std::map<std::type_index, Component*>

С использованием шаблонов и typeofЯ создал геттер для этих компонентов:

Physics *p = object.get<Physics>();

Я уже очень доволен этим, но есть ли способ использовать этот тип шаблона в качестве индексатора? Что-то вроде этого:

Physics *p = object[Physics];

0

Решение

Это, вероятно, лучшее, что вы можете достичь не прибегая к макросам или создание ненужных экземпляров:

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>) { }
};

пример живой wandbox

1

Другие решения

Physics является типом, и поэтому вы не можете передать его функции (оператор является просто синтаксическим сахаром для функции). Что вы можете сделать, это передать экземпляр:

Physics *p = object[Physics{}]; // assuming Physics is default-constructible

Но если вы не можете создать Physics Например, это решение не будет работать. Другое решение заключается в создании enumи передайте это оператору:

enum class types {
Physics, SomethingElse
};

Physics *p = object[types::Physics];

Вместо того, чтобы использовать typeof, вы должны сравнить значение types перешел в функцию.

0

По вопросам рекламы [email protected]