将任何类型的std :: vector传递给函数

时间:2009-10-28 23:19:43

标签: c++ templates vector

假设:

template<typename T> class A {  
  B b;
  std::vector<T> vec1;
  std::vector<T> vec2;
}

我希望B有一个成员函数fill(),它引用那些向量,并根据b中包含的一些信息填充值为T的vec2。 一种方法是为每个可能的参数T重载fill():

fill(const std::vector<float>& a, std::vector<float>& b)

等等但是这意味着很多不必要的重复,因为每个可能的T的操作是相同的。在fill()内部我可以使用vector :: value_type进行计算,但我不知道如何声明它以这种方式,它需要各种std :: vector。显而易见的方法是使用带模板的自由函数。有没有更简单的方法呢?

4 个答案:

答案 0 :(得分:5)

模仿B。

template<typename T> class B {
  void fill(const std::vector<T>& a, std::vector<T>& b) { }
};

template<typename T> class A {  
  B<T> b;
  std::vector<T> vec1;
  std::vector<T> vec2;
}

如果你不想模仿B,那么将填充函数模板化:

class B {
  template<typename T>
  void fill(const std::vector<T>& a, std::vector<T>& b) {}
};

答案 1 :(得分:5)

你已经得到了很多答案,但至少在某种程度上我不得不反对它们。我的直接反应是你不应该将 vector 传递给b::fill。相反,您应该传递迭代器(或者可能是一对迭代器)。其余的大部分是正确的:这仍然意味着fill应该是模板成员函数。当您调用它时,您可能希望传递std::back_insert_iterator,通常使用std::back_inserter获得。

你说的部分内容似乎是自相矛盾的:如果b::fill修改vec1vec2,他们可能作为参考传递到const。不可否认,const在应用于容器时并不具有其通常的含义,但事实仍然是将对const的引用传递给一个函数,该函数的唯一目的显然是修改传递的内容似乎是错误的。

答案 2 :(得分:4)

模板化fill

class B {
public:
  template<typename T>
  void fill(const std::vector<T>& a, std::vector<T>& b)
  { /*...*/ }
  //...
};

(根据您的说明,它会看到b应为const std::vector<T>&。)

答案 3 :(得分:2)

您可以将B定义为模板类,填充为模板函数(在非模板类B中)或者我最喜欢的,使用标准std::transform / std::copy / std::fill,这些已经是模板功能,用于填充矢量 (全部位于<algorithm>标题内)。