【发布时间】:2015-04-04 18:45:46
【问题描述】:
我正在努力在 C++11 中创建一个工厂库(类似于可用于 Java 的 https://github.com/google/guice),以熟悉模板编程,并创建一个有用的依赖减少工具。这个想法是工厂将抽象出对象的创建和销毁的细节,并隐藏实现细节。理想情况下,我想要类似的东西:
InterfaceClass
{
public:
virtual void doSomething () = 0;
virtual ~InterfaceClass () {};
}
// Might need custom deleter depending on how the class was allocated
// (might come from a pool, etc)
ImplementationClass : public InterfaceClass
{
public:
// Some (possibly) complicated constructor.
ImplementationClass(Dependency one, Other dependency) {}
virtual void doSomething ()
{
// Implementation
}
virtual ~ImplementationClass ()
{
}
}
理想情况下,我希望图书馆的最终用户能够(或类似的东西):
std::unique_ptr<InterfaceClass> object = factory<InterfaceClass>();
如果所有类都使用默认删除器,这将非常有用,但在自定义删除器的情况下,unique_ptr 的类型将从:
std::unique_ptr<I>
到:
std::unique_ptr<I, deleter>
——据我所知,这些类型不兼容。
有没有一种方法可以定义某种更高级别的“唯一指针”,它不关心其类型签名中的删除器?使 API 与对象的创建/删除无关的其他可能解决方法?
谢谢!
【问题讨论】:
-
您的课程需要自定义删除器来做什么?虚拟析构函数以何种方式不足以自定义清理?
-
我想到了一个这样的用例:当获取一个对象时,它可能来自一个预先分配的内存池。在这种情况下,我不想让 unique_ptr 释放该内存。创建它的池可能希望保留可用块的计数,在这种情况下删除只是将块标记为再次可用。
-
大概是工厂知道这些细节吧。所以让它返回适当的
unique_ptr专业化;调用者可以使用auto来避免拼写类型。或者,使用shared_ptr代替unique_ptr- 使用shared_ptr,自定义删除器不是类型的一部分。 -
感谢@igor 的关注——我想避免使用auto,因为这实际上不允许这两种类型相互兼容。它只是避免了输入差异。我个人也发现使用 auto 会使对象的类型更难追踪。
标签: c++ templates c++11 factory unique-ptr