我有一个支持不同成员分配器的类模板:
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);