Я хочу понять, как работает std::function
. Для простоты рассмотрим функции только для перемещения без аргументов.Как стираются классы стирания типа самоуничтожения, такие как функция std :: function?
Я понимаю, что std::function
стирает тип своей цели с помощью обычных методов типа стирания:
template<class Result>
struct function
{
public:
template<class Function>
function(Function&& f)
: f_(std::make_unique<callable_base>(std::forward<Function>(f)))
{}
// XXX how to implement constructor with allocator?
template<class Alloc, class Function>
function(const Alloc& alloc, Function&& f);
Result operator()() const
{
return (*f_)();
}
private:
struct callable_base
{
virtual Result operator()() const = 0;
virtual ~callable_base(){}
};
template<class Function>
struct callable
{
mutable Function f;
virtual Result operator()() const
{
return f;
}
};
// XXX what should the deleter used below do?
struct deleter;
std::unique_ptr<callable_base, deleter> f_;
};
Я хотел бы расширить функциональные возможности этого типа для поддержки пользовательского распределения. Мне нужно будет удалить тип распределителя, но это трудно сделать с использованием std::unique_ptr
. Пользовательский делетит, присвоенный unique_ptr
, должен знать конкретный тип Function
, предоставленный конструктору, чтобы иметь возможность правильно освободить его хранилище. Я мог бы использовать еще один unique_ptr
, чтобы напечатать стирание deleter, но это решение является круглым.
Кажется, что callable<Function>
необходимо освободить себя. Каков правильный способ сделать это? Если я освобожусь от деструктора callable<Function>
, это кажется слишком ранним, потому что его члены все еще живы.
Обратите внимание, что в C++ 17 удаляется поддержка распределителя для 'std :: function'. – Brian