我有一些代码可以直接使用allocator
代替operator new
和operator delete
进行改造。此代码的公共接口的一部分是返回不是光头指针而是返回shared_ptr
(由从new
移出的光头指针构造。)
我在公共合同中看到一个分配器有几个名为pointer
,const_reference
等的typedef。这个想法不是直接引用类型T *
,我可能会使用{{1允许分配器作者滑入C指针以外的其他东西。
但我反过来将正常指针包装在智能指针中,这需要一个诚实的C指针(我想。)如果我尝试将代码更改为使用分配器的typedef,我会遇到麻烦吗?我还没有尝试(因为有一些腿部工作只是为了尝试)所以我先问...
编辑:以下是我想改变的一些代码(我没有第一次包含,因为它不是很友好。)
pointer
特别是,调用template<typename Injector, typename Iface, typename Allocator, typename Impl, typename A1>
class New<Injector, Iface, Allocator, Impl, Impl(A1)>: public Binding<Injector> {
public:
static Impl * provide(Injector const & injector) {
SAUCE_SHARED_PTR<A1> a1(injector.template provide<A1>());
return initializer(injector).template construct<Impl, SAUCE_SHARED_PTR<A1> >(a1);
}
static void dispose(Injector const & injector, Iface * iface) {
Impl * impl = static_cast<Impl *>(iface);
initializer(injector).destroy(impl);
}
};
// Elsewhere
template<typename Iface>
SAUCE_SHARED_PTR<Iface> provide() const {
Iface * provided = provideFromBinding<Iface>(
Module::template bindings<Injector_> );
SAUCE_SHARED_PTR<Iface> smartPointer;
smartPointer.reset(provided, deleter);
return smartPointer;
}
表达式结果的construct
和destroy
模板方法目前直接使用了initializer(injector)
和new
。我希望使用delete
代替,并将它们切换到展示位置new / explicit destroy,以制作类似
Allocator
问题是,我应该尝试尊重分配器的typedef吗?看起来我应该是或者我没有正确使用分配器(更不用说务实地说几乎所有这些都将具有“无聊的”typedef值。)
我可以肯定地跳到它template<typename Injector, typename Iface, typename Allocator, typename Impl, typename A1>
class New<Injector, Iface, Allocator, Impl, Impl(A1)>: public Binding<Injector> {
public:
static Impl * provide(Injector const & injector) {
SAUCE_SHARED_PTR<A1> a1(injector.template provide<A1>());
Allocator allocator;
Impl * impl = allocator.allocate(sizeof(Impl));
initializer(injector).template construct<Impl, SAUCE_SHARED_PTR<A1> >(impl, a1);
return impl;
}
static void dispose(Injector const & injector, Iface * iface) {
Allocator allocator;
Impl * impl = static_cast<Impl *>(iface);
initializer(injector).destroy(impl);
allocator.deallocate(impl, sizeof(Impl));
}
};
而不是Allocator::pointer
,直到我试图把它推到Impl *
。也许它只是在那里工作?这是我的问题。也许比我更熟悉标准的人可能会说“只要shared_ptr
嘎嘎叫Allocator::pointer
并且你注册了一个自定义删除器,你会没事的。”
编辑: @bdonlan提出了一个很好的观点,即operator*
模仿的是shared_ptr
,而不是Allocator::value_type
。相反,它可能在内部持有Allocator::pointer
。这似乎回答了这个问题,除了分配器作者可能会选择在他们的Allocator::value_type *
上实现operator Allocator::value_type *
,即使使用转换后的值,它也会根据某些具体情况“全部解决” - 语义。
标准是否要求分配者作者执行此操作?
编辑:请参阅related.
答案 0 :(得分:0)
shared_ptr
(以及其他TR1智能指针)根据元素类型定义(即采用模板参数),不指针类型。因此,如果您使用shared_ptr
,则无法替换自己的指针表示;在大多数情况下这样做也没有意义。