如何使函数不知道其const参数的分配器?



我有一个支持不同成员分配器的类模板:

template<typename Alloc>
class Foo
{
std::vector<int, Alloc<int>> data;
// other members ...
};

考虑一个函数func接受一个const Foo&。由于分配器是Foo类型的一部分,我需要将其声明为模板:

template<typename Alloc>
void func(const Foo<Alloc>& foo);

在我的理解中,当只查看const Foo&时,分配器无关紧要,因此func的所有实例化都是相同的。除了代码膨胀之外,这还引入了不必要的依赖项。

  • 是否有办法使func不知道分配器?
  • 在函数(然后不再需要是模板)中设置一个分配器(例如std::allocator)并在调用它时从Foo<MyCostumAllocator<int>>Foo<std::allocator<int>>执行reinterpret_cast是否安全?

我知道std::pmr::polymorphic_allocator没有这个问题(只要你只使用pmr分配器),但这不是我的选择。

您在func中看到的问题是次要的。Foo的不同实例是完全不同的不同类型。因此,func的不同实例化也必须是不同的函数。

但是,如果Foo的接口不依赖于分配器,您可以添加一个不知道分配器的基类:

struct Foo_base {
// virtual interface
};
template <typename Alloc>
struct Foo : Foo_base {
std::vector<int, Alloc<int>> data;
};
void func(const Foo_base& foo);

最新更新