我有很多函数被定义为:
template<typename T>
void myFunction1(vector<T>& vin);
关键是,我输入一个 STL 向量并做一些工作。
我最近需要将默认分配器更改为客户分配器。这似乎会破坏每个函数,除非我将定义更改为:
template<typename T, typename Alloc>
void myFunction1(vector<T,Alloc>& vin);
为了使它更加复杂,我不会在所有情况下都使用重载的分配器。
这是否意味着我必须使用两个定义重写每个函数,一个使用分配器的模板,另一个使用分配器的定义?我真的希望这不是答案...
更简单的解决方案可能是在迭代器方面实现函数,就像在标准库算法中所做的那样:
template <typename Iterator>
void myFunction1(Iterator1 first, Iterator2 last) { .... }
拥有一个遵循完整类模板的函数模板就完全足够了。假设,这将可以:
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;
// ...
}
<</div>
div class="one_answers">我认为您也更改了模板。但好消息是您可以将模板更改为以下内容:
template <typename MyVector>
void myFunction1(MyVector& vin);
为每个函数模板提供两个重载。只需提供两个参数。 std::vector
有两个模板参数,因此可以很好地推断出这两个参数。