【发布时间】:2020-01-17 09:13:19
【问题描述】:
让我们假设下面这个类层次结构。
class BaseClass {
public:
int x;
}
class SubClass1 : public BaseClass {
public:
double y;
}
class SubClass2 : public BaseClass {
public:
float z;
}
...
我想为这些类创建一个异构容器。由于子类是从基类派生的,我可以做这样的事情:
std::vector<BaseClass*> container1;
但从 C++17 开始,我也可以像这样使用std::variant:
std::vector<std::variant<SubClass1, SubClass2, ...>> container2;
使用其中一种的优点/缺点是什么?我也对表演感兴趣。
考虑到我将按x 对容器进行排序,并且我还需要能够找出元素的确切类型。我要去
- 装满容器,
- 按
x排序, - 遍历所有元素,找出类型,相应地使用它,
- 清空容器,然后循环重新开始。
【问题讨论】:
-
container1 - 遍历容器并具有子类行为,在基类中至少有一个虚函数(可能是析构函数)。 container2- 更多类似类型的安全联合,其中一个对象是可见的。
-
std::visitofstd::variant会调用类似于虚拟调度。 -
@Sylvester 你如何使用它们?我的意思是,您是否在每个元素上调用虚函数?最佳解决方案取决于用例。请用一个例子更新问题。
-
"找出类型,使用它" 你可以在基类中声明虚函数。那可能会更干净,但如果没有更多信息,很难说什么会更干净。
-
您可以在基类中声明一个虚函数
sendData并为每个子类覆盖它。没有必要明确地“找出类型”。
标签: c++ stl containers c++17 heterogeneous