標題頁 / 元函數

元函數

MPL 包含了大量預定義的元函數,它們可以大致分為兩類:通用元函數, 處理有條件 類型選擇 以及高階元函數 調用, 合成, 以及 參數綁定, 和 數值元函數, 封裝內建和用戶定義的 算術, 比較, 邏輯, 和 位操作 操作。

由於本就可以在編譯期以常規的操作符來執行整型數值計算,看起來對上述第二類元函數的需要不太明顯,但是實際上,它在使得MPL編程更為容易這一點上扮演了核心角色。具體地說,至少在兩種情形下,內建的語言工具存在不足[3]:

  1. 傳遞一個計算對算法。
  2. 對非整型數據執行計算。

第二種情形值得特別關注。與內建的嚴格的編譯期整型算術相比,MPL的數值元函數是 多態的, 可以支持 混合類型算術。這意味著它們可以操作於不同的數值類型 — 例如有理數、定點數或複數 — 通常你可以在單個表達式中隨意混合各種類型。關於MPL數值基礎設施的細節請見 數值元函數 概念一節。

為了減少以元函數表示法取代中綴操作符表示法所帶來的負面語法影響,所有數值元函數允許被傳入最多 N 個參數,其中 N 由 BOOST_MPL_LIMIT_METAFUNCTION_ARITY 配置宏定義。

[3] 在編寫本文檔的時候(2004年早期),還考慮到對整型常量使用內建操作符還常常帶來可移植性的問題 — 許多編譯器不能處理特定形式的表達式,迫使我們使用條件編譯。由於MPL數值元函數根據類型來工作,且在內部封裝了這些,所以可以躲開這些問題,如果你的 目標是可移植性,建議你使用數值元函數取替常規的操作符,即使會帶來一點可讀性下降的代價。