假设:
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。显而易见的方法是使用带模板的自由函数。有没有更简单的方法呢?
答案 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
修改vec1
和vec2
,他们可能不作为参考传递到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>
标题内)。