2012-11-15 40 views
0

打破我有一吨的功能被定义为这样的:模板功能与新的分配器

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

问题的关键是,我输入一个STL向量和做一些工作。

我最近需要将默认分配器更改为客户分配器。这似乎除非我改变定义,以打破各功能:

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

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

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

回答

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; 
    // ... 
} 
+0

你不应该去variadics。图书馆要求说有一个名为'vector'的模板需要两个类型参数;虽然允许实现添加额外的参数,但不允许它们使'vector 不起作用。如果您尝试编写自己的标准库类型声明,那么您可能会遇到麻烦的地方。使用标准库类型只需要按照文档进行工作。 –

+0

@PeteBecker:你说得对。我在考虑一个不同的情况(专业化),在那里“允许的额外论据”来咬你。不过,让我从这篇文章中删除它吧! –

+0

关于专业化的好处。我没有想到这一点。 –

0

我认为你也改变了你的模板。 但好消息是,你可以在你的模板改成这样:

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

当然,这种改变意味着该函数可以被任何类型调用,而不仅仅是一个“vector”。 –

2

一个简单的解决方案可能是实现迭代器方面的功能,在标准库算法来完成:

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

您不必提供两个重载每个函数模板。只需提供双参数即可。 std::vector有两个模板参数,所以两者都可以推导出来。