传递给 std::basic_string 的分配器能否将其方法设为虚拟

Posted

技术标签:

【中文标题】传递给 std::basic_string 的分配器能否将其方法设为虚拟【英文标题】:Can an allocator passed to std::basic_string have its methods virtual 【发布时间】:2016-03-28 18:58:56 【问题描述】:

我需要为 std::basic_string 支持各种类型的分配器(静态、动态、池化等)。此外,我只想为所有这些提供一种类型。所以有多种类型,如:

std::basic_string<char, std::char_traits<char>, static_alloc_t>
std::basic_string<char, std::char_traits<char>, dyna_alloc_t>
std::basic_string<char, std::char_traits<char>, pool_alloc_t>

不会工作。

如果我使用 std::basic_string 需要的所有方法定义一个基本分配器类型作为虚拟,然后编写多个由此派生的类并覆盖这些虚拟方法,是否可以做到这一点。当我创建字符串对象时,我传递了正确的派生类型。

这个方案会违反标准吗?我见过 std 库创建传递的分配器副本的地方。在这种情况下,它将调用我的基本分配器的复制构造函数,而不是派生类型。

【问题讨论】:

你在寻找类似polymorphic_allocator的东西吗? 是的,但是c++11应该支持。我不确定 polymorphic_allocator 是否是 c++11 的一部分? 否,但您仍然可以使用该设计,该设计可在 C++11 中实现。 你说的设计具体指的是什么?我可以在这里使用不违反标准要求的特定设计吗? N3916 解释polymorphic_allocator 和朋友的设计。基本的东西很容易实现。 (作用域分配器模型部分很棘手,但您可能不需要它。) 【参考方案1】:

如果我使用 std::basic_string 需要的所有方法定义一个基本分配器类型作为虚拟,然后编写多个由此派生的类并覆盖这些虚拟方法,是否可以做到这一点。当我创建字符串对象时,我传递了正确的派生类型。

是的……但你为什么要这样做?如果您知道分配器的类型,则不需要是多态的。

如果您有不知道类型的情况,并且希望多态地处理分配器,可以这样做但不能直接完成。

这是因为分配器必须是可复制的,而多态对象不能通过其基类复制。

您必须将继承封装在一个能够正确处理克隆的具体容器类中。

您还必须考虑一个分配器必须与其副本比较的复杂性。

【讨论】:

以上是关于传递给 std::basic_string 的分配器能否将其方法设为虚拟的主要内容,如果未能解决你的问题,请参考以下文章

从‘std::wstring aka std::basic_string<wchar_t>’到非标量类型‘UString aka std::basic_string<char>

为啥 std::basic_string::substr 不遵循 [begin, end) 约定?

如何让 `std::basic_string<CustomClass>` 编译?

std::basic_string<TCHAR> 在 Windows 上会比 std::wstring 更可取吗?

为啥 C++ 标准中没有 std::string_view 类型的参数的 std::basic_string 类的构造函数[重复]

将 std::basic_string<Char> 转换为字符串