我想创建一个类似数组类型的函数(例如std :: vector,std :: array,C array,...等)。我的函数体只要求参数有一个下标operator [],它返回一个特定的类型。 例如,假设我想编写以下函数,有没有办法只编写一次代码而不是重复相同的代码三次?
AddOne(std::array<double> &array, int size){
for(int i=0;i<size;i++){
array[i] += 1;
}
AddOne(std::vector<double> &array, int size){
for(int i=0;i<size;i++){
array[i] += 1;
}
AddOne(double *array, int size){
for(int i=0;i<size;i++){
array[i] += 1;
}
提前致谢!
答案 0 :(得分:3)
是的,这就是模板的用途:
template<typename T>
AddOne(T &array, int size){
for(int i=0;i<size;i++) {
array[i] += 1;
}
}
请注意,您无需明确指明该类型需要[]
运算符。这将在使用模板的每个位置进行检查(这可能导致C ++臭名昭着的不可读的编译错误)。
更惯用的方法是传递一对迭代器:
template<typename T>
AddOne(T begin, T end) {
for (; begin != end; begin++) {
(*begin) += 1;
}
}
例如std::vector
,您需要致电AddOne(my_vector.begin(), my_vector.end())
。对于原始数组,您只需传递指针,例如AddOne(my_array, my_array + size)
。