Как упростить типы классов std :: option

Я уверен, что есть простой способ сделать это, но не смог найти ничего в SO.
Не могу найти много информации в en.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 снова и снова повсюду вокруг проекта?

живой код

#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;
}

0

Решение

Вы хотите определить псевдонимы. Это может быть сделано с using или же typedef, using более знаком программистам C ++ из-за его синтаксиса, typedef является C-совместимым.

typedef std::variant<int, double, float> arithmetic;
using arithmetic = std::variant<int, double, float>;
//Both are equivalent

std::vector<arithmetic> entityContainer;
void function(std::vector<arithmetic> const& vector) {
/*...*/
}
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]