首頁 > 後端開發 > C++ > 如何在 C 初始化列表中明確呼叫模板建構函數?

如何在 C 初始化列表中明確呼叫模板建構函數?

Linda Hamilton
發布: 2024-11-27 08:28:10
原創
714 人瀏覽過

How to Explicitly Invoke Template Constructors in C   Initializer Lists?

初始化列表中明確調用模板構造函數

在 C 中,在類別構造函數中初始化物件時如何調用明確模板構造函數?考慮以下範例:

struct T { 
    template<class> T();
};

struct U {
    U() : t<void>() {} // This approach does not work
    T t;
};
登入後複製

問題陳述

提供的程式碼嘗試在 U 的初始值設定項清單中明確呼叫 T 的範本建構子。但是,此方法失敗。

答案

C 中不支援明確呼叫初始值設定項清單中的範本建構子。此限制源於這樣一個事實:模板參數通常是在函數模板名稱之後使用尖括號指定的。由於建構函式沒有自己的名稱,因此沒有傳統的方法可以將模板參數傳遞給它們。

說明

C 標準在第14.8.1/7 節中明確指出了此限制:

[Note: because the explicit template argument list follows the function template name, and because conversion member function templates and constructor member function templates are called without using a function name, there is no way to provide an explicit template argument list for these function templates. ]
登入後複製

解決方法

一種解決方法方法是利用輔助型別將模板參數傳遞為接受型別標識的建構子的參數。例如:

struct T { 
    template<class U> T(identity<U>);
};

struct U {
    U() : t(identity<void>()) {}
    T t;
};
登入後複製

在這種情況下,Boost 中定義的身份模板可以用來包裝模板參數。或者,在 C 20 中,可以使用 std::type_identity 類型。

參考

  • [std::type_identity](https://en.cppreference.com/w /cpp/types/type_identity)

以上是如何在 C 初始化列表中明確呼叫模板建構函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板