Я уверен, что есть простой способ сделать это, но ничего не смог найти в SO.Не удалось найти много информации в ru.cppreference.com .
Есть ли способ упростить std::variant</*class types*/>
, чтобы мы могли объявлять функции и классы, которые могут принимать одно и то же std::variant
в качестве аргумента.
Рассмотрим этот пример:
У меня есть вектор, который действует как контейнер для следующих std::variant
;
std::vector<std::variant<Car, Space, Human>> EntityContainer;
, если я хочу передать этот векторв качестве аргумента, я должен добавить следующее объявление параметра.
void Function(std::vector <std::variant<Car, Space, Human>>& container);
Возможно, я мог бы использовать макрос для этого примера, но это на самом деле не решает проблему.
Есть ли лучшее решение для этого, чем перечислять одни и те же типы классов в std::variant
снова и снова повсюду вокруг проекта?
code live
#include <iostream>
#include <vector>
#include <variant>
class Human
{
public:
void Talk(){ std::cout << "whass up\n"; }
};
class Car
{
public:
void RunEngine() { std::cout << "Vroom\n"; }
};
class Space
{
public:
void Expand() { std::cout << "Expand slowly\n"; }
};
struct VisitPackage
{
void operator()(Human& obj) { obj.Talk();}
void operator()(Car& obj) { obj.RunEngine();}
void operator()(Space& obj) { obj.Expand();}
};
void Function(std::vector <std::variant<Car, Space, Human>>& container)
{
for (auto& entity : container)
{
std::visit(VisitPackage(), entity);
}
}
int main()
{
std::vector<std::variant<Car, Space, Human>> EntityContainer;
EntityContainer.emplace_back(Car());
EntityContainer.emplace_back(Human());
EntityContainer.emplace_back(Space());
Function(EntityContainer);
return 0;
}