Существует единственная версия функции:
template<typename T, typename... ARGUMENTS>
std::unique_ptr<T, HeapDeleter<T>> allocate_unique( ARGUMENTS&&... arguments ) {
/*... */
}
, где HeapDeleter реализован как:
template<typename T>
class HeapDeleter {
public:
HeapDeleter( const HeapAllocator<T>& allocator ) : m_allocator( allocator ) {}
using pointer = typename std::allocator_traits<HeapAllocator<T>>::pointer;
void operator()( pointer ptr ) const {
if( ptr != nullptr ) {
HeapAllocator<T> allocator( m_allocator );
/* Call T's destructor */
ptr->~T();
/* Deallocate memory */
allocator.template deallocate<1>( ptr );
}
}
Кажется, это работает нормально. Мое намерение состоит в том, чтобы реализовать вещи для обработки массивов. Функция allocate должна выглядеть следующим образом:
template<typename T, typename... ARGUMENTS>
std::unique_ptr<T[], HeapDeleter<T[]>> allocate_array( ARGUMENTS&&... arguments ) {
HeapAllocator<T> allocator;
/* Allocate array which size is equal to number of arguments given */
T* ptr = allocator.template allocate<sizeof...(ARGUMENTS)>();
if( ptr != nullptr ) {
std::ptrdiff_t idx = 0;
( ::new( static_cast<void*>( ptr + idx++ ) ) T( arguments ),... );
}
return std::unique_ptr<T[], HeapDeleter<T[]>>( ptr, HeapDeleter<T[]>( allocator ) );
}
Но я борюсь с реализацией HeapDeleter для типа T [] ... Итак, как мне изменить или, скорее, специализировать средство удаления для HeapDeleter? Мой компилятор (GCC) всегда жалуется на error: invalid use of array with unspecified bounds
... Большое спасибо заранее за вашу помощь!