相关疑难解决方法(0)

Ad hoc多态和具有值语义的异构容器

我有许多不相关的类型,它们都通过重载的自由函数(ad hoc多态)支持相同的操作:

struct A {};

void use(int x) { std::cout << "int = " << x << std::endl; }
void use(const std::string& x) { std::cout << "string = " << x << std::endl; }
void use(const A&) { std::cout << "class A" << std::endl; }
Run Code Online (Sandbox Code Playgroud)

正如问题的标题所暗示的那样,我希望将这些类型的实例存储在异构容器中,这样use()无论它们具体是什么类型,我都可以使用它们.容器必须具有值语义(即两个容器之间的赋值复制数据,它不共享它).

std::vector<???> items;
items.emplace_back(3);
items.emplace_back(std::string{ "hello" });
items.emplace_back(A{});

for (const auto& item: items)
    use(item);
// or better yet
use(items);
Run Code Online (Sandbox Code Playgroud)

当然,这必须是完全可扩展的.考虑一个带有a的库API vector<???>,以及将自己的类型添加到已知类型的客户端代码.


通常的解决方案是将(智能)指针存储到(抽象)接口(例如vector<unique_ptr<IUsable>>),但这有许多缺点 - 从我的头脑:

  • 我必须将当前的ad hoc多态模型迁移到类层次结构中,其中每个类都继承自公共接口.哦,快! …

c++ polymorphism containers heterogeneous c++11

32
推荐指数
3
解决办法
5275
查看次数

当虚拟继承是一个好的设计?

编辑3:请务必在回答之前清楚地了解我的要求(有EDIT2和很多评论).有(或有)许多答案清楚地表明对问题的误解(我知道这也是我的错,对不起)

嗨,我class B: public virtual A {...}在C++中查看了关于虚拟继承()的问题,但没有找到我的问题的答案.

我知道虚拟继承存在一些问题,但我想知道的是虚拟继承被认为是一种好的设计.

我看到人们提到类似IUnknownor的接口ISerializable,而且该iostream设计也基于虚拟继承.那些是很好地利用虚拟继承的好例子,是因为没有更好的选择,或者因为在这种情况下虚拟继承正确的设计?谢谢.

编辑:澄清,我问的是现实生活中的例子,请不要抽象.我知道虚拟继承是什么以及哪种继承模式需要它,我想知道的是何时它是做事的好方法而不仅仅是复杂继承的结果.

EDIT2:换句话说,我想知道钻石层次结构(这是虚拟继承的原因)何时是一个好的设计

c++ multiple-inheritance virtual-inheritance

26
推荐指数
1
解决办法
6933
查看次数