由分配器参数化的函数模板,用于构造不同类型的容器

时间:2012-11-01 05:58:10

标签: c++ allocator

我想在这些行中使用函数foo

template <class T, class Alloc>
void foo(T param, Alloc a) {
    vector<int, Alloc<int> > vect_of_ints;
    list<float, Alloc<float> > list_of_floats;
    do_something()
}

std::allocator a
foo(42, a);

这失败了,我认为因为std::allocator不是一个定义良好的类型,直到它被特定类型的特殊化。是否有可能做我想做的事,但以其他方式做。

1 个答案:

答案 0 :(得分:4)

您不能拥有分配器(a)的一个实例,并期望它适用于2种不同的类型。但是,您可以使用allocator泛型类型(模板模板参数),并以两种不同的方式在foo()中对其进行特殊处理。 无论如何,你没有在你的foo()上使用“a”。

template <template<class> class Alloc, class T>
void foo(T t1, T t2) {
    vector<int, Alloc<int> > vect_of_ints;
    list<float, Alloc<float> > list_of_floats;
    do_something()
}

// UPDATE: You can use a function wrapper, and then the compiler will be
// able to figure out the other types.
template<class T>
void foo_std_allocator(T t1, T t2)
{
    foo<std::allocator, T>(t1, t2);
}


int main()
{
    //std::allocator a;
    //foo<std::allocator>();
    foo<std::allocator, int>(1, 2);

    // in the call below, the compiler easily identifies T as int.
    // the wrapper takes care of indicating the allocator
    foo_std_allocator(1, 2);

    return 0;
}