1

我确信有一种简单的方法可以做到这一点,但在 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;
}
4

1 回答 1

7

您正在寻找定义别名。这可以用using或来完成typedefusing由于它的语法,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) {
    /*...*/
}
于 2018-10-08T19:20:30.260 回答