C++模板编程
854 浏览 5 years, 11 months
3 函数模板
版权声明: 转载请注明出处 http://www.codingsoho.com/函数模板
还可以为独立函数编写模板。例如,可编写一个通用函数,该函数在数组中查找一个值并返回这个值的索引:
static const size_t NOT_FOUND = (size_t)(-1);
template <typename T>
size_t Find(T& value, T* arr, size_t size)
{
for (size_t i = 0; i < size; i++) {
if (arr[i] == value) {
return i; // found it; return the index
}
}
return NOT_FOUND; // failed to find it; return NOT_FOUND
}
这个Find()函数可用于任何类型的数组。例如,可通过这个函数在一个int数组中查找一个int值的索引,还可以用这个函数在一个SpreadsheetCell数组中查找一个SpreadsheetCell的值的索引。
可通过两种方式调用这个函数:一种是通过尖括号显式地指定类型;另一种是忽略类型,让编译器根据参数自动推导类型。下面列举一些例子:
int main()
{
int x = 3, intArr[] = {1, 2, 3, 4};
size_t sizeIntArr = sizeof(intArr) / sizeof(int);
//
size_t res;
res = Find(x, intArr, sizeIntArr); // calls Find<int> by deduction
res = Find<int>(x, intArr, sizeIntArr); // calls Find<int> explicitly
if (res != NOT_FOUND)
cout << res << endl;
else
cout << "Not found" << endl;
//
double d1 = 5.6, dArr[] = {1.2, 3.4, 5.7, 7.5};
size_t sizeDoubleArr = sizeof(dArr) / sizeof(double);
//
res = Find(d1, dArr, sizeDoubleArr); // calls Find<double> by deduction
res = Find<double>(d1, dArr, sizeDoubleArr); // calls Find<double> explicitly
if (res != NOT_FOUND)
cout << res << endl;
else
cout << "Not found" << endl;
//
//res = Find(x, dArr, sizeDoubleArr); // DOES NOT COMPILE! Arguments are different types.
//
SpreadsheetCell c1(10), c2Arr[2] = {SpreadsheetCell(4), SpreadsheetCell(10)};
size_t sizeC2Arr = sizeof(c2Arr) / sizeof(SpreadsheetCell);
//
res = Find(c1, c2Arr, sizeC2Arr); // calls Find<SpreadsheetCell> by deduction
res = Find<SpreadsheetCell>(c1, c2Arr, sizeC2Arr); // calls Find<SpreadsheetCell> explicitly
//
return 0;
}
与类模板一样,函数模板也可以接受非类型的参数。为简单起见,这里只给出了一个函数模板使用类型参数的例子。
C++标准库提供了一个比上例中呈现的函数强大得多的模板化find()函数。