【发布时间】:2013-01-09 12:54:48
【问题描述】:
尝试重构一些基础架构代码我决定使用继承来实现多个类之间的多态行为。下一步是将它们放入容器中,遍历它们并 DoSomething();
我目前的容器构造很笨拙。即使我对容器使用这个elegant 解决方案,构造仍然是一团糟。
vector<unique_ptr<Parent>> vec;
vec.push_back(unique_ptr<Parent>(new ChildA(var1, var2)));
vec.push_back(unique_ptr<Parent>(new ChildB(var3, var4)));
vec.push_back(unique_ptr<Parent>(new ChildC(var5, var6)));
ChildA、ChildB 和 ChildC 彼此都是多态的。 Var1 ... var6 可能来自不同的类型,并且是构建子对象所必需的。
我想在几个地方创建这个向量以供使用。问题是孩子的数量可能会有所不同,因此孩子需要构建的数据。尝试走 stdarg.h 的路径失败,因为不支持:
if !defined(_WIN32)
#error ERROR: Only Win32 target supported!
#endif
您将如何实现构造此数组的工厂方法?
更新,想要的解决方案:
vec = CreatePolyVec(var1, var2, typeInfo1, var3, var4, typeInfo2, var5, var6 typeInfo3);
vec = CreatePolyVec(var1, var2, typeInfo1, var3, var4, typeInfo2);
第 1 行将创建与上面相同的数组。 第 2 行将重用相同的代码来创建一个相似的向量,但对象更少。 Typeinfo 保存创建对象所需的信息。
这是一个基本的解决方案,更高级的解决方案将在编译时强制执行参数列表。例如以下对函数的调用没有意义:
vec = CreatePolyVec(var1, var2,typeinfo1, var3, var4, typeinfo2, var5);
没有足够的参数来创建最后一个子对象。
【问题讨论】:
-
你的编译器支持 C++11 可变参数模板吗?
-
您能否提供所需解决方案的示例用例(以代码形式)?
-
您的应用程序是 WinRT 还是 .NET 应用程序?可能是这个原因?
-
我来自 Windows 领域,我用 C++ 编写。
-
正在阅读您的更新...您可能应该查看如何进行“完美转发”。
标签: c++ polymorphism containers