首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C++ 模板實例化:尖括號省略規則與非類型參數傳遞詳解

     編輯:程式設計疑難解答

一、何時可以省略模板參數尖括號?

編譯器透過引數推導決定實際類型。若推導無歧義,可省略;否則必須顯式指定。

可省略的典型場景

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); // 強制使用模板版本

二、非類型模板參數 (NTTP) 傳遞函數指標

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)

三、圖片代碼解讀

圖中展示將函數指標作為模板參數傳遞,並在參數列表賦值實例化,屬合法用法。

代碼截圖1 代碼截圖2
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved