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()函数。