在以下容器中重新绑定的目的
Purpose of rebind in the following container
我正在阅读一些 C++ 代码,特别是试图了解自定义容器。
容器具有以下模板参数:
template<typename T, typename Alloc>
class container{ ... };
其中 T
是数据类型,如 float
或 int
。 Alloc
是分配器,可能是标准库之一。
在该容器中,我发现以下内容:
class Container{ ....
template<typename NewType>
struct Rebind
{
using newalloc = typename std::allocator_traits<Alloc>::template rebind_alloc<NewType>;
using Other = container<NewType, newalloc>
}
}
我在任何地方都找不到 Rebind
的结构成员,至少我在努力理解它的目的。
开发人员试图通过在容器中包含结构来实现什么?
它不是数据成员。它是一个模板成员,允许代码(可能本身就是一个模板)使用类似的分配器获得不同的容器类型。
例如对每个元素应用一个函数以获得结果的新容器
template <typename Container, typename Function, typename Result = typename Container::template Rebind<std::invoke_result_t<Function, typename Container::const_reference>>::Other>
Result transform(const Container & container, Function function)
{
Result result(container.get_allocator());
for (auto & element : container) { result.push_back(function(element); }
return result;
}
我正在阅读一些 C++ 代码,特别是试图了解自定义容器。
容器具有以下模板参数:
template<typename T, typename Alloc>
class container{ ... };
其中 T
是数据类型,如 float
或 int
。 Alloc
是分配器,可能是标准库之一。
在该容器中,我发现以下内容:
class Container{ ....
template<typename NewType>
struct Rebind
{
using newalloc = typename std::allocator_traits<Alloc>::template rebind_alloc<NewType>;
using Other = container<NewType, newalloc>
}
}
我在任何地方都找不到 Rebind
的结构成员,至少我在努力理解它的目的。
开发人员试图通过在容器中包含结构来实现什么?
它不是数据成员。它是一个模板成员,允许代码(可能本身就是一个模板)使用类似的分配器获得不同的容器类型。
例如对每个元素应用一个函数以获得结果的新容器
template <typename Container, typename Function, typename Result = typename Container::template Rebind<std::invoke_result_t<Function, typename Container::const_reference>>::Other>
Result transform(const Container & container, Function function)
{
Result result(container.get_allocator());
for (auto & element : container) { result.push_back(function(element); }
return result;
}