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

pmr*_*pmr 2 c++ templates vector

鉴于:

template<typename T> class A {  
  B b;
  std::vector<T> vec1;
  std::vector<T> vec2;
}
Run Code Online (Sandbox Code Playgroud)

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

fill(const std::vector<float>& a, std::vector<float>& b)
Run Code Online (Sandbox Code Playgroud)

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

Ben*_*ins 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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


Jer*_*fin 5

你已经得到了很多答案,但至少在某种程度上我不得不同意这些答案.我的直接反应是,你应该不是通过载体b::fill的.相反,您应该传递迭代器(或者可能是一对迭代器).其余的大部分是正确的:这仍然意味着fill应该是模板成员函数.当你打电话给它时,你可能想要通过一个std::back_insert_iterator通常获得的std::back_inserter.

你所说的内容部分似乎自相矛盾的是:如果b::fill修改vec1vec2,他们或许应该被作为常量引用传递.不可否认,const当应用于容器时,它没有完全正常的含义,但事实仍然是将对const的引用传递给一个函数,该函数的唯一目的显然是修改传递的内容似乎是错误的.