編譯器透過引數推導決定實際類型。若推導無歧義,可省略;否則必須顯式指定。
template <typename T> void foo(T x); // 函數參數帶有模板類型
foo(10); // 推導 T = int
foo(3.14); // 推導 T = double
template <typename T> T foo(); // 無參數,無法推導
foo<int>(); // 必須顯式指定
template <typename T> void foo(T x);
void foo(int x); // 非模板重載
foo(10); // 呼叫非模板版本,非模板優先
foo<double>(10); // 強制使用模板版本
C++ 允許以函數指標作為模板參數:
void callback(int) { /* ... */ }
template <void (*Func)(int)>
void invoker(int v) { Func(v); }
invoker<callback>(42); // 實例化時傳入函數指標
C++17 起支援 auto 推導 NTTP:
template <auto Func>
void invoker2(int v) { Func(v); }
invoker2<callback>(42); // 自動推導為 void(*)(int)
圖中展示將函數指標作為模板參數傳遞,並在參數列表賦值實例化,屬合法用法。