C++模板编程


667 浏览 5 years, 4 months

3.1 函数模板特例化

版权声明: 转载请注明出处 http://www.codingsoho.com/

函数模板特例化

就像类模板的特例化一样,函数模板也可以特例化。例如,假设想要编写一个用于char* C风格字符串的Find()函数,这个函数通过strcmp()而不是通过operator==来比较字符串。下面是完成这个任务的特例化的Find()函数:

template<>
size_t Find<char*>(char*& value, char** arr, size_t size)
{
    cout << "Specialization" << endl;
    for (size_t i = 0; i < size; i++) {
        if (strcmp(arr[i], value) == 0) {
            return i; // found it; return the index
        }
    }
    return NOT_FOUND; // failed to find it; return NOT_FOUND
}

如果参数类型可以通过参数本身推导出来,那么可以在函数名中忽略<char*>,将这个函数原型简化为:

template<>
size_t Find(char*& value, char** arr, size_t size)

然而如果还涉及重载,那么类型推导规则就会显得很诡异,因此为了避免出错,最好显式地注明类型。

尽管特例化的find()函数可以接受char*而不是char*&作为第一个参数,但最好让参数和函数非特例化版本的参数保持一致,这样可以让函数推导规则正常工作。

这个特例化版本的使用示例如下:

char* word = "two";
char* arr[] = {"one", "two", "three", "four"};
size_t sizeArr = sizeof(arr) / sizeof(arr[0]);
size_t res;
res = Find<char*>(word, arr, sizeArr); // Calls the char* specialization
res = Find(word, arr, sizeArr);        // Calls the char* specialization