Как упростить типы классов std :: option - PullRequest
0 голосов
/ 08 октября 2018

Я уверен, что есть простой способ сделать это, но ничего не смог найти в 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;
}

1 Ответ

0 голосов
/ 08 октября 2018

Вы хотите определить псевдонимы.Это можно сделать с помощью 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) {
    /*...*/
}
...