0

我有很多函数被定义为:

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

重点是,我输入一个 STL 向量并做一些工作。

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

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

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

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

4

4 回答 4

2

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

template <typename Iterator>
void myFunction1(Iterator1 first, Iterator2 last) { .... }
于 2012-11-15T15:35:27.840 回答
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;
    // ...
}
于 2012-11-15T15:36:22.270 回答
0

我认为你也改变了你的模板。但好消息是您可以将模板更改为:

template <typename MyVector> 
void myFunction1(MyVector& vin);
于 2012-11-15T15:33:36.597 回答
0

您不必为每个函数模板提供两个重载。只需提供两个参数之一。std::vector有两个模板参数,所以都可以推导出来就好了。

于 2012-11-15T15:38:05.840 回答