LINUX.ORG.RU

Хранение переменной одного из двух типов

 


0

1

Есть два enum для двух очень похожих, но не пересекающихся категорий.
И стандартные map’ы где хранятся элементы:

struct Entity {
    const int v1;
    int v2;
/* дальше кучка методов с формулами */
};
enum class First { ... };
enum class Second { ... };
std::map<First, Entity> FirstMap;
std::map<Second, Entity> SecondMap;

Хочется написать некий класс View, который будет запоминать часть данных от Entity на момент создания View. А также возможность обновить представление. Что то типа:

View( First t, const Entity & e ){...}
View( Second t, const Entity & e){...}

Как лучше хранить t внутри объекта View? т.к. без этого не сделать «обновление данных» в View, надо знать, что за сущность отображается. Отображение First отличается от отображения Second, поэтому и затык.

Про std::variant и его аналоги в курсе, но вдруг найдется более лучше решение, т.к. здесь всего 2 возможных типа.
Или можно по другому организовать хранение данных, чтобы такая проблема вообще не возникла? Буду рад любым идеям.


внутри view надо хранить ссылку или указатель:

const Entity & t

но ты эту ссылку там в итоге забудешь и сделаешь сегфолт. поэтому вью надо либо создавать временно и сразу уничтожать, и никогда не копировать, либо материализовать когда ты к нему обращаешься.

anonymous
()
struct Entity {
    const int v1;
    int v2;
/* дальше кучка методов с формулами */
};
enum class First { ... };
enum class Second { ... };

советую почитать про С++. Там говорят классы завезли и наследование и прочее ООП.

fsb4000 ★★★★★
()

Самое важное не написал. Как и где храняться объекты типа View, как используются? Хватит ли статического полиморфизма (шаблон View), или нужен динамический (варианты, виртуальные методы)?

anonymous
()
Ответ на: комментарий от ia666

Иногда хочется без наследования, или дофига хочется?

Каждый пишет как ему удобно. Если вам удобно, то и хорошо…

ООП в последнее время не любят. Но иногда классы и наследование это не плохо…

fsb4000 ★★★★★
()

а, ты спрашиваешь как хранить enum. ну как enum и храни

template <typename T>
class View {
  T mytype;
  const Entity & e;
}
anonymous
()
Ответ на: комментарий от anonymous

тогда это будут два разных типа View<First> и View<Second>

хотя если этот View используется только как параметр функций, то можно эти функции сделать шаблонными…

fsb4000 ★★★★★
()
Ответ на: комментарий от fsb4000

ну да. или не передавать вью в функции, а передавать Entity &. если енумов два, то всё равно же надо будет либо делать функцию шаблонной, либо делать две функции под каждый енум. если он уберёт class из енума, то можно передавать как int, но ему зачем-то понадобились отдельные типы под каждый enum, поэтому для каждого типа теперь понадобится своя реализация.

class ViewBase {
  const Entity & e;
}

template <typename T>
class View : public ViewBase {
  T t;
}
anonymous
()
Ответ на: комментарий от fsb4000
auto views = std::tuple {
View{First::Value, Entity{1,1}},
View{Second::Value, Entity{2,1}},
//  и так далее
}

int main() {
   auto v = std::get<1>(views);
   // можно придумать статический for_each для tuple
   for_each(views, [](auto&& v){ process(v); });
}
anonymous
()
Ответ на: комментарий от anonymous

Про кортежи я почему то забыл.

Здесь была простыня текста с размышлениями, но в процессе написания произошло переосмысление и оказалось, что я сам дурак.
Косяк был в том, что я неправильно организовал структуру хранения данных

Спасибо за внимание, вопрос снят

ia666
() автор топика
Ответ на: комментарий от anonymous

Ну так часто бывает, сидишь пишешь вопрос подробно, пока пишешь - находишь ответ.
Сама задача то осталась нерешенной, я просто избавился от двух enum, поэтому вопрос отпал сам собой.
Когда сталкиваешься с подобным невольно начинаешь думать, что воюешь не в ту сторону, часто так оно и есть.

ia666
() автор топика
Ответ на: комментарий от ia666

Всегда полезно с кем-то поговорить о проблеме, обращайся. Только что-то я очкую, главное чтобы в конечном итоге стало лучше, а не хуже. Удачи.

anonymous
()

Про std::variant и его аналоги в курсе, но вдруг найдется более лучше решение, т.к. здесь всего 2 возможных типа.

А тебе что, больше надо? Возьми variant и не городи велосипеды.

hateyoufeel ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.