Пользовательский удалитель для std :: unique_ptr - PullRequest
0 голосов
/ 25 октября 2019

Существует единственная версия функции:

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 ... Большое спасибо заранее за вашу помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...