Я экспериментирую с C ++ 17 std :: variable для хранения данных нескольких типов на карте. В данном случае используется карта контроллеров универсальных типов (но ограниченная std::variant
), которую я могу перебирать и вызывать методы.
В приведенном ниже примере,
#include <iostream>
#include <map>
#include <variant>
class ControlA {
public:
void specificToA() { std::cout << "A" << std::endl; }
};
class ControlB {
public:
void specificToB() { std::cout << "B" << std::endl; }
};
template<typename T>
class ControlItem{
T* control;
public:
ControlItem() = default;
~ControlItem() = default;
void doStuff() {
if constexpr (std::is_same_v<T, ControlA>) {
control->specificToA();
}
if constexpr (std::is_same_v<T, ControlB>) {
control->specificToB();
}
}
};
class MyClass {
public:
void cycleThroughMap();
std::map<std::string, std::variant<ControlItem<ControlA>, ControlItem<ControlB>>> controlMap;
};
Эвристический метод для этого будет получить сопоставленное значение каждого объявленного типа, например:
void MyClass::cycleThroughMap() {
for (auto controlItem : controlMap) {
if (auto control = std::get_if<ControlItem<ControlA>>(&controlItem.second)) {
control->doStuff();
} else if (auto control = std::get_if<ControlItem<ControlB>>(&controlItem.second)) {
control->doStuff();
} else
std::cout << "Unknown type!" << std::endl;
}
}
Это работает, но кажется, что его не существует.
Можно ли использовать std::variant
для этого? Это плохая идея с самого начала, я должен использовать наследование и вуаля?