如何简化 std::variant class 类型
How to simplify std::variant class types
我确信有一种简单的方法可以做到这一点,但在 SO 中找不到任何东西。
在 en.cppreference.com 中也找不到太多信息。
有没有一种方法可以简化 std::variant</*class types*/>
以便我们可以声明函数和 class 可以采用相同 std::variant
作为参数的函数和 classes。
考虑这个例子:
我有一个向量,它充当以下内容的容器 std::variant
;
std::vector<std::variant<Car, Space, Human>> EntityContainer;
如果我想将这个向量作为参数传递给函数,我必须添加以下参数声明。
void Function(std::vector <std::variant<Car, Space, Human>>& container);
我也许可以使用 macros 作为这个例子,但这并不能真正解决问题。
是否有更好的解决方案,而不是在项目的任何地方一遍又一遍地在 std::variant
中列出相同的 class 类型?
#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;
}
您要定义别名。这可以用 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) {
/*...*/
}
我确信有一种简单的方法可以做到这一点,但在 SO 中找不到任何东西。 在 en.cppreference.com 中也找不到太多信息。
有没有一种方法可以简化 std::variant</*class types*/>
以便我们可以声明函数和 class 可以采用相同 std::variant
作为参数的函数和 classes。
考虑这个例子:
我有一个向量,它充当以下内容的容器 std::variant
;
std::vector<std::variant<Car, Space, Human>> EntityContainer;
如果我想将这个向量作为参数传递给函数,我必须添加以下参数声明。
void Function(std::vector <std::variant<Car, Space, Human>>& container);
我也许可以使用 macros 作为这个例子,但这并不能真正解决问题。
是否有更好的解决方案,而不是在项目的任何地方一遍又一遍地在 std::variant
中列出相同的 class 类型?
#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;
}
您要定义别名。这可以用 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) {
/*...*/
}