Te pongo el equivalente, esto es código en producción (con censura, obviamente) que hice para un allocator usado en strings:
template<class BaseAllocator>
struct PlinPlinAllocator : public BaseAllocator
{
using typename BaseAllocator::value_type;
using BaseAllocator::BaseAllocator;
void deallocate(value_type* p, std::size_t n)
{
// se pinchó la nariz
BaseAllocator::deallocate(p, n);
}
};
template <class BaseAllocator>
class std::allocator_traits<PlinPlinAllocator<BaseAllocator>> : public std::allocator_traits<BaseAllocator>
{
public:
using allocator_type = PlinPlinAllocator<BaseAllocator>;
static allocator_type select_on_container_copy_construction(const allocator_type& a)
{
return allocator_type(a);
}
// estas dos son backward compatible:
template <class T>
using rebind_alloc = PlinPlinAllocator<typename std::allocator_traits<BaseAllocator>::template rebind_alloc<T>>;
template <class T>
using rebind_traits = std::allocator_traits<rebind_alloc<T>>;
};
Me llevó tiempo entender y hacer ésto :) si hay dudas preguntame.
Espero haberte ahorrado todo el reniegue que me llevó a mí.
Dato: lo del BaseAllocator es simplemente porque quiero que mi plin plin allocator EXTIENDA al std::allocator, pero para vos es completamente opcional.