我想了解如何实施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
来键入擦除删除器,但该解决方案是循环的。
似乎callable<Function>
需要自行释放。这样做的正确方法是什么?如果我在callable<Function>
's 的析构函数内部解除分配,那似乎还为时过早,因为它的成员还活着。