我有以下情况:
basestuff
是一个实现我的基本模型的共享库...
derivedstuff
对于每个实现都是不同的,并表示应用程序对象。
utilitystuff
是具有实用程序功能的共享库。
以下是代码:
namespace basestuff {
class Base {} // Base model
virtual std::unique_ptr<Base> createNew(); // Factory
}
namespace derivedstuff {
class Derived : public Base {} // Derived model
// Factory implementation
std::unique_ptr<basestuff::Base> createNew () {
return str::unique_ptr<basestuff::Base>(new Derived);
}
}
namespace utilitystuff {
class Utility {
/// get data and populate the vector element
getDataList(std::vector<std::unique_ptr<basestuff::Base>> &list,
std::function<std::unique_ptr<basestuff::Base>()> &factory)
{
for (...)
{
// ... Read data from somewhere and populate it...
// create new element and add to vector
std::unique_ptr<basestuff::Base> item = factory();
list.push_back(std::move(item));
}
};
}
}
以下是我想要的代码:
main()
{
utilitystuff::Utility reader;
derivedstuff::Derived dummy;
std::vector<std::unique_ptr<derivedstuff::Derived> myClassList;
reader.getDataList(&myClassList, dummy.createNew);
}
但这不起作用,因为unique_ptr
需要来自Base
类型,即使我将其更改为Base
,getDataList()
也不接受参数它与Base
类不同。
有没有办法只使用Derived
上的main()
并使Base
对此级别透明,而无需在一种类型和另一种类型之间进行转换?
我已经阅读了关于投射的帖子here,但我不想在这里使用演员表。我只想在上面的图层中使用Derived
,让底层(Base
)解决问题。