【问题标题】:Custom allocator compatibilty自定义分配器兼容性
【发布时间】:2017-12-04 07:32:15
【问题描述】:

给定以下函数签名

void foo(std::vector<int> &bar);

还有一个自定义分配器CustomAlloc,使用std::vector&lt;int, CustomAlloc&gt; 的实例调用foo 会导致

could not convert ‘bar’ from ‘std::vector<int, CustomAlloc<int, [...] >}’ to ‘std::vector<int>’

我不是 C++ 模板专家,如果我错了,请纠正我,但我的理解是 std::vector&lt;int&gt; 默认为 std::vector&lt;int, std::allocator&lt;int&gt; &gt; (gcc 7.1.1.-3),因此定义了一个完全不相关的类型。


这个beeing说我正在尝试找到一些解决方案来使foo可以使用std::vector&lt;int, CustomAlloc&gt;调用并附带以下内容。

template<typename Allocator>
void foo(std::vector<int, Allocator> &bar);

我不喜欢分配器规范传播模板的方式,但我猜这就是 STL 的工作方式。

所以我的问题是,鉴于foo 专门在int 上运行,您将如何解决这个问题?

PS:抱歉标题不好,我只是找不到好标题

【问题讨论】:

  • 不清楚是否需要foo接受不同类型的参数,但如果要求只使用CustomAlloc,则可以不带任何模板声明void foo(std::vector&lt;int, CustomAlloc&gt; &amp;bar);

标签: c++ c++11 templates vector allocator


【解决方案1】:

标准中有一个全新的命名空间来解决这个问题 - namespace pmr。见polymorphic_allocator: when and why should I use it?

关于在没有pmr 解决方案的情况下,您可以采取哪些措施来避免使用模板传播此问题。答案是您不能,您需要硬指定分配器参数,或者您需要模板化向量以接受任何类型的分配器。

【讨论】:

  • 谢谢,这看起来很有希望,并为这个问题提出了一个优雅的解决方案。
猜你喜欢
  • 2018-06-21
  • 1970-01-01
  • 1970-01-01
  • 2013-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-08
  • 1970-01-01
相关资源
最近更新 更多