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>
,有没有办法仍然可以获得默认值?
答案 0 :(得分:7)
标准仅为具有多个模板类型参数的分配器提供默认rebind
:
17.6.3.5分配要求[allocator.requirements]
3注意A:上表中的成员类模板
rebind
是 实际上是一个typedef模板。 [注意:一般来说,如果名称Allocator
必然会SomeAllocator<T>
Allocator::rebind<U>::other
与SomeAllocator<U>
的类型相同, 其中SomeAllocator<T>::value_type
为T
,SomeAllocator<U>:: value_type
为U
。 - 尾注]如果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>; };
};
关于允许Allocator<T, Args...>
形式的分配器而不是形式为Alloc<T, Ns...>
的分配器的分配器的基本原理,人们只能猜测,但是它也会导致过多的{{1}这就是为什么模板元编程库(例如Boost.MPL)总是将类型Alloc<T, Args.., Ns...>
的非类型参数N
包装在T
之类的内容中。通过定义
integral_constant<T, N>