STL向量的模板函数与新的分配器断开

时间:2012-11-15 15:29:52

标签: c++ templates allocator

我有很多函数被定义为:

template<typename T>
void myFunction1(vector<T>& vin);

关键是,我输入了一个STL向量并做了一些工作。

我最近需要将默认分配器更改为客户分配器。除非我将定义更改为:

,否则这似乎打破了所有功能
template<typename T, typename Alloc>
void myFunction1(vector<T,Alloc>& vin);

为了使它更复杂,我不会在所有情况下都使用重载分配器。

这是否意味着我必须用两个定义重写每个函数,一个用于分配器的模板,另一个定义没有分配器?我真的希望这不是答案......

4 个答案:

答案 0 :(得分:2)

更简单的解决方案可能是在迭代器方面实现您的函数,就像在标准库算法中一样:

template <typename Iterator>
void myFunction1(Iterator1 first, Iterator2 last) { .... }

答案 1 :(得分:1)

拥有一个尊重完整类模板的单一功能模板是完全足够的。假设,这样做:

template <typename T, typename Alloc>
void myFunction1(std::vector<T, Alloc> & v);

每个向量都有这两个参数,无论分配器是否默认。

然而,更有成效的习惯用法是将整个容器作为模板:

template <typename V>
void myFunction1(V & v)
{
    typedef typename V::value_type value_type;
    // ...
}

答案 2 :(得分:0)

我认为您必须更改模板。 但好消息是你可以将模板更改为:

template <typename MyVector> 
void myFunction1(MyVector& vin);

答案 3 :(得分:0)

您不必为每个功能模板提供两个重载。只提供双参数。 std::vector有两个模板参数,因此两者都可以推断得很好。