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

How to make a function unaware of the allocator of its const argument?

我有一个 class 模板,它支持其成员的不同分配器:

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

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

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

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

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

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

但是,如果Foo的接口不依赖于allocator,你可以添加一个allocator unaware base class:

 struct Foo_base {
      // virtual interface
 };

 template <typename Alloc>
 struct Foo : Foo_base {
     std::vector<int, Alloc<int>> data;
 };

 void func(const Foo_base& foo);