[英]C++: are “trait” and “meta-function” synonymous?
“ Meta”是用於模板編程的C ++術語。 一個清晰的例子是Boost Meta Programming Library(MPL)。
從這個意義上說,元函數是一種函數,其域不是對象,而是C ++構造。 因此,公共輸入是類型,普通功能和其他模板。
一個簡單的元函數例如是template<typename T> using Foo = Bar<T, int>
,其輸入為T
類型,輸出為Foo<T>
。 是的,是微不足道的,但是普通函數也可以是微不足道的。
特征是一個元函數,其共域是一個常量表達式,通常為布爾值。 例如is_foo<T>::value
顯然是布爾值。 在這個意義上,最古老的特征是sizeof(T)
其共域是size_t
。
這些術語不等效。
C ++標准中未定義該術語。
似乎有兩個主要的競爭定義:
1)“元函數在編譯時派生/計算/映射到值或類型(基於其參數/參數)”, 和/或
constexpr
函數可以包含或不包含在任何給定人員的定義/概念中; 有功能上的重疊,但是很多現有的提及元函數的文字早於或沒有討論constexpr
函數,因此很難知道是否有意給定任何定義或示例為它們留出空間或排除它們 2)“元函數是利用模板元編程的函數和/或類”,具體意味着可以將代碼核心(模板)用於不同的參數,從而基於其執行一些代碼生成或轉換
“元函數接受類型和編譯時常量作為參數,並返回類型/常量。與名稱相反,元函數是類模板。”
“代碼...已執行,其結果在編譯時使用。...元函數可以計算兩件事:值或類型”
本文使用“元函數”來指代產生編譯時值/類型的類模板
C ++標准未定義“特征”,但是定義了“特征類”:
17.3.25 [defns.traits]特征類
一個類,它封裝了類模板和函數模板操作為其實例化的類型的對象所必需的一組類型和函數[注:第21、22和27章中定義的Traits類是字符特征,它們提供了字符處理支持字符串和iostream類所需。 —尾注]
我要補充一點,特征可以具有值以及類型和函數-例如, rank
公開::value
。 特性提供類型/值,從而可以深入了解參數類型本身或系統在處理該類型變量時使用特征的系統所需行為。
標准庫的字符特征包含運行時功能的示例:例如X::length(p)
, X::find(p, n, c)
。
C ++標准庫中的<type_traits>
標頭是一個初步了解trait可用於何種事物的好地方。
特性是傳統上且通常是(但現在C ++ 11不一定提供constexpr
函數)類,與元或其他函數不同。
特征可以告訴您參數T
是否為常數,是否可序列化,或者在通過TCP傳輸時是否應該對其進行壓縮:無論是否需要其他通用代碼,都必須針對其處理的類型范圍自定義其行為。
有時,特性將由使用它們的系統提供-有時,它們可以由希望按類型自定義其行為的客戶端代碼提供。
特性可以使用各種參數類型的測試來推斷事物,或者可以是手工制作的專門針對特定類型的值進行硬編碼的值。
這個ACCU特質介紹]( http://accu.org/index.php/journals/442 )值得一讀,其中包括C ++創建者的這句話:
將特征視為一個小的對象,其主要目的是攜帶由另一個對象或算法使用的信息來確定“策略”或“實現細節”。 -Bjarne Stroustrup
無論采用哪種元功能定義,標准都與實現細節有關:何時可以評估功能,和/或是否涉及代碼生成/轉換。 與此形成鮮明對比的是特征,關鍵概念/要求是其目的,而不是使用模板專門化或實例化來實現(但不是通用的)通用實現,而是使用任何編譯時間與運行時評估能力。
元函數(在C ++上下文中)是產生可在編譯時使用的結果的函數。 結果可以是類型(只能在定義時使用部分特殊化技術在定義時獲得)或值(可以在編譯時使用模板參數可以是整數值而不僅僅是類型的事實來計算) )。
特征本質上是一個類(或對象),它打包信息(策略約束,類型特征,實現細節),以便在編譯時由另一個類(或對象)使用。 打包的信息可以包括類型信息(例如typedef
)或感興趣的屬性。 例如, std::numeric_limits<T>
(可通過<limits>
)是“類型特征”,它提供有關算術類型的信息(例如T
是整數類型嗎? T
可以表示有界還是有限的一組值? T
signed
嗎?等)。 信息以某種形式打包,以便元程序(即模板函數或類)可以在編譯時使用該信息。 例如,模板元函數可能使用來自類型特征的信息來確保僅針對無符號整數類型實例化模板,如果嘗試為其他類型實例化模板,則觸發編譯錯誤。
從這個意義上說,特征是一種元函數,它在編譯時提供信息以供其他元函數使用。
據我所知,這些術語還沒有任何正式的定義。 因此,我將提供我使用的那些。
元功能是返回類型的模板。 通常,返回的結果是一個包含名為“ type”的成員類型的類型,因此可以通過后綴:: type進行訪問。 調用元功能的示例:
using new_type = std::common_type<int, char>::type;
(請參閱http://en.cppreference.com/w/cpp/types/common_type )
特征是特殊類型的元函數,它返回可轉換為bool的結果。 例:
bool ic = std::is_convertible<char, int>::type;
請注意,如今,放松了對元功能結果具有成員名稱“ type”的要求,因此可以以可以刪除:: type的方式定義某些元功能。 例:
bool ic = std::experimental::is_convertible_v<char, int>;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.