std :: allocator_traits默认使用具有多个模板参数的allocator

时间:2016-01-18 18:08:38

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

当我提供具有单个模板参数的分配器的STL样式容器时,

std::allocator_traits自动运行它的魔力但是当我提供具有两个模板参数的分配器的STL样式容器时它不会但在其他方面是相似的。

告诉std::allocator_traits如何与具有多个模板参数的分配器进行交互,我需要做什么?在这种情况下,是否可以让std::vector<>提供合理的默认值?

作为一个例子,如果我在Allocator Boilerplate中使用简单的分配器Howard Hinnant并将其提供给int,那么一切都很顺利。如果我在allocator模板中添加一个虚拟rebind参数(并根据需要进行轻微修改),那么我会遇到编译错误,因为编译器无法找到std::allocator_traits等。< / p>

以下是代码中的描述:

http://coliru.stacked-crooked.com/a/173c57264137a351

如果在这种情况下我必须自己专注<item android:state_pressed="true"> <shape android:shape="oval"> <gradient android:centerX=".6" android:centerY=".40" android:endColor="@color/colorPrimary" android:gradientRadius="20" android:startColor="@color/colorPrimary" android:type="radial" /> <stroke android:width="1dp" android:color="#FFFFFF" /> <size android:width="55dp" android:height="55dp" /> </shape> </item> <item android:state_focused="false"> <shape android:shape="oval"> <gradient android:centerX=".6" android:centerY=".40" android:endColor="@android:color/transparent" android:gradientRadius="20" android:startColor="@android:color/transparent" android:type="radial" /> <stroke android:width="1dp" android:color="#FFFFFF" /> <size android:width="55dp" android:height="55dp" /> </shape> </item> ,有没有办法仍然可以获得默认值?

1 个答案:

答案 0 :(得分:7)

标准仅为具有多个模板类型参数的分配器提供默认rebind

  

17.6.3.5分配要求[allocator.requirements]

     

3注意A:上表中的成员类模板rebind是   实际上是一个typedef模板。 [注意:一般来说,如果名称   Allocator必然会SomeAllocator<T>   Allocator::rebind<U>::otherSomeAllocator<U>的类型相同,   其中SomeAllocator<T>::value_typeTSomeAllocator<U>:: value_typeU。 - 尾注]如果Allocator是一个类模板   表单SomeAllocator<T, Args>的实例化,其中Args为零   或更多类型参数Allocator不提供rebind成员   模板,标准allocator_traits模板使用SomeAllocator<U, Args>&gt;默认情况下代替Allocator:: rebind<U>::other:用于   不是上述模板实例的分配器类型   表格,没有提供默认值。

由于您有非类型(int)参数,因此没有提供默认值。修复很简单:只需将自己的重新绑定添加到分配器中即可。

template<class T, int I>
class allocator_w_int
{
    // as before

    template<class U>
    struct rebind { using other = allocator_w_int<U, I>; };    
};

Live Example

关于允许Allocator<T, Args...>形式的分配器而不是形式为Alloc<T, Ns...>的分配器的分配器的基本原理,人们只能猜测,但是它也会导致过多的{{1}这就是为什么模板元编程库(例如Boost.MPL)总是将类型Alloc<T, Args.., Ns...>的非类型参数N包装在T之类的内容中。通过定义

,这也是一条路线
integral_constant<T, N>

Live Example