Найти и обработать альтернативы, содержащиеся в списке std :: варианты - PullRequest
0 голосов
/ 21 октября 2019

Давайте создадим очень простой шаблон элемента:

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 и т. Д.

...