如何使函数不知道其 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
的所有实例化都是相同的。除了代码膨胀之外,这还引入了不需要的依赖项。
- 有没有办法让
func
不知道分配器?
- 在函数中设置一个分配器(例如
std::allocator
)(然后不再需要是模板)并在调用它时从 [= 执行 reinterpret_cast
是否安全? 20=] 到 Foo<std::allocator<int>>
?
我知道 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);
我有一个 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
的所有实例化都是相同的。除了代码膨胀之外,这还引入了不需要的依赖项。
- 有没有办法让
func
不知道分配器? - 在函数中设置一个分配器(例如
std::allocator
)(然后不再需要是模板)并在调用它时从 [= 执行reinterpret_cast
是否安全? 20=] 到Foo<std::allocator<int>>
?
我知道 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);