Давайте создадим очень простой шаблон элемента:
template <typename T>
struct Element
{
int id;
T value;
};
и функцию шаблона, обрабатывающую два из них:
template <typename T1, typename T2, typename R>
R DoSomething(T1 const& t1, T2 const& t2)
{
; // do something with t1 and t2
}
Мне нужно хранить разные списки элементов с одинаковым временемпоэтому я определил псевдонимы этих типов (чтобы векторы одного типа были в разных списках):
using IntListT = std::list<std::vector<Element<int>>>;
using DblListT = std::list<std::vector<Element<double>>>;
using StrListT = std::list<std::vector<Element<std::string>>>;
для хранения всех элементов в одном члене класса. Я использую эту карту:
using ListVariantT = std::variant<IntListT, DblListT, StrListT>;
std::map<std::type_index, ListVariantT> myElements;
Вопрос. Моя функция-член получает два идентификатора элемента (конечно, два целых). Как найти два запрошенных элемента и передать их в DoSomething func?
Я определенно НЕ настаиваю на хранении всех элементов на одной карте или на использовании std :: варианта вообще. Но сохранение элементов в (многих) различных векторах должно быть сохранено из-за соображений производительности ...
Большое спасибо всем
РЕДАКТИРОВАТЬ:
всеИдентификаторы уникальны для всех Element<T>
. Таким образом, ID однозначно идентифицирует элементы
, а типы результатов операций между типами задаются конструкцией системы (специализируя стандартные операторы для типа Element<T>
), поэтому шаблон параметра R не имеет смысла вФактический код (использовался только для иллюстрации и полноты)
std :: visit здесь не сильно помогает. Мне нужно найти два разных элемента (или ссылки на них) (в конечном итоге) разных типов, а затем передать их в функцию DoSomething ().
«причины производительности» трудно объяснить безпогрузиться в детали. У меня много разных однородных векторов Элементов одного типа, которые я обрабатываю по-разному. Обычно перебираю и делаю математику / статистику / преобразования / и т.д. Теперь я расширяю функциональность для поддержки операций с различными типами элементов. Например, если у меня есть вектор Element<int>
и Element<double>
, я смогу собрать все элементы в новый вектор Element<double>
. В качестве альтернативы, если пользователь выбирает Элемент E1, другой элемент E2, передает мне свои идентификаторы, я могу найти их и вернуть E1 + E2, возможно, E1 * E2 и т. Д.