namespace seafire::common { template T& allocator_t:: alloc() { return alloc_emplace(); } template T& allocator_t:: alloc(T const& object) { return alloc_emplace(object); } template T& allocator_t:: alloc(T&& object) { return alloc_emplace(object); } template T& allocator_t:: alloc_emplace(Args&&... args) { struct object_t : allocation_t { object_t(Args&&... args) : object{std::forward(args)...} {} T object; }; std::unique_ptr a{ new object_t{std::forward(args)...} }; auto& ref = a->object; allocations_.emplace(std::move(a)); return ref; } } // namespace seafire::common