聊聊模板

jeyawn發表於2020-10-18

看下面的例子,

void printEx(){}

template <typename T, typename... Types>
void printEx(const T& firstArg, const Types... args) {
    std::cout << firstArg << std::endl;
    printEx(args...);
}

void testFun {
    printEx(1, "abc", 100, 1.5f,  'c', new char [5]);
}

我們檢視下它編譯後的情況如下:

可以看到,這個模板函式生成了各個版本的呼叫,這個就是模板的實質,當編譯的時候會根據原始碼的具體實現情況,生成實際的函式呼叫程式碼。

在本例中,我們的模板是不固定引數的,其依賴於printEx(1, "abc", 100, 1.5f,  'c', new char [5]);

而該函式必須實現下面的版本:

printEx(int, const char*, int, float, char, char*), 在這個實現內部會繼續呼叫

printEx(const char*, int, float, char, char*), 每次遞迴減少一個引數

最終以printEx() 結束