2012-04-21 102 views

回答

4

升壓提供特徵爲元函數和高階函數,但其​​概念是不特定於升壓。

術語「元函數」介紹了使用模板特,讓編譯器在編譯的時候根據自己的模板參數做出決定一個模板元編程技術。

通常,一元函數可以看起來像這樣

template<bool B> 
struct my_metafunction 
{ 
    enum { value = 1 }; 
}; 

template<> 
struct my_metafunction<false> 
{ 
    enum { value = 0 }; 
}; 

my_metafunction時,的my_metafunction<B>::value的確切值將取決於的值(即my_metafunction<true>::value將是不同的,以my_metafunction<false>::value) 。如果你不熟悉模板元編程,那麼你可能想知道爲什麼是非常有用的 - 而現實是,它通常只是供人們寫這在很大程度上使用模板和編譯時決策庫有用。 (模板元編程是一種完全不同的模式!)


,另一方面,「高階函數」描述了函數式編程技術,它允許你將函數作爲函數參數。在標準C++中使用標準容器來處理標準<algorithm>庫會更容易一些。例如,C++包含一個稱爲transform的高階函數 - 其目的是逐步遍歷容器中的每個元素(例如向量,字符串,列表,映射,數組等),併爲每個元素執行轉換元件。

std::string str = "Hello, World"; 
std::transform(str.begin(), 
       str.end(), 
       str.begin(), 
       std::toupper); // Note - toupper is a function! 

std::cout << str << std::endl; 

執行的轉換取決於其最終參數std::toupper。 std :: toupper的目的是接受(字符)值並返回該值的大寫版本。的std ::爲str.begin()str.end()之間的每個元件變換TOUPPER的抓鬥的結果(並且在此示例中,結果被放回STR)

有很多的高階函數其它實例在標準庫 - std::find_ifstd::sortstd::count_if,僅舉幾例。 C++中的高階函數通常可以接受任何類型的可調用對象,包括函數,lambda或函數對象。
被傳遞的可調用的對象通常被稱爲[I]謂詞[/ I](雖然我不能完全肯定,如果這就是術語「上游」的正確用法)


升壓佔位符是函數式編程的另一個方面的一部分,稱爲currying - 它允許您在函數調用之前將參數'綁定'到函數。 (在Boost世界中,currying的結果是一個函數對象,通常被傳遞給一個更高階的函數)。

柯里的目的是作爲一種替代編寫自己的定製專門調用對象,通過重用現有可調用的對象/謂詞和正在使用前在混凝土中設置一些他們的論據。

例如,你可以使用高階功能find_if搜索字符串的第一個字符是「大於q」。 C++標準庫包含一個名爲greater_equals的可調用對象,除了它需要第二個參數供find_if使用(「大於等於**表示什麼?」)

沒有currying,你可能會寫一個函數現在)如

bool greater_than_or_equals_to_q(char c) 
{ 
    return c >= 'Q'; 
} 

與鑽營,可以「綁定」字符「Q`,以便創建一個斷言僅接受一個參數的greater_equals函數,並且表示謂詞的所有情況下,靈敏度當它的論點「大於或等於Q」時會產生真實性。

std::bind(std::greater_equal<char>(), 
      std::placeholders::_1, 
      'Q'); 

因此,使用大寫字符串:

std::string str = "HELLO WORLD"; 
auto gt_eq_Q = std::bind(std::greater_equal<char>(), 
          std::placeholders::_1, 
          'Q'); 

auto iter = std::find_if(str.begin(), str.end(), gt_eq_Q); 
std::cout << *iter << std::endl; 

輸出,正如所料 - 第一個字符在的「Hello World」,其是大於或 - 等於到「Q」發生是 'W'

W 
+0

可能錯誤的佔位符OP想知道的。 Boost.MPL具有更高階的元功能(儘管OP確實提到了函數),比如'less <_1, _2>'。 [相關文檔](http://www.boost.org/doc/libs/1_49_0/libs/mpl/doc/tutorial/tutorial-metafunctions.html)。 – 2012-04-22 01:33:45

+2

「謂詞」是評估一些對象(或多個對象)上的條件的函數,返回條件是否爲真。因此,高階函數將謂詞函數作爲參數是相當普遍的(例如,一個過濾函數返回符合某些條件的集合的所有元素都會接受函數來測試條件,所以您不必重寫針對每種可能情況的過濾功能)。所以謂詞基本上是你傳遞給高階函數的一種特殊類型*總是將它們稱爲謂詞是不正確的。 – Ben 2012-04-22 12:19:59

4

有關詳細說明看看

  1. http://www.artima.com/cppsource/metafunctions.html
  2. http://www.mywikinet.com/mpl/paper/mpl_paper.pdf

原則元函數可以是:

  • 類模板中,所有的參數都是類型
  • 與公開訪問類型的類type

例如:

template <bool, class L, class R> 
struct IF 
{ 
    typedef R type; 
}; 

template <class L, class R> 
struct IF<true, L, R> 
{ 
    typedef L type; 
}; 

對另一個函數進行操作的函數被稱爲高階函數。所以,高階元函數是一個元函數,它接受其他元函數作爲參數並在計算過程中使用它們。這在概念上類似於在運行時接受作爲參數的另一個函數或函數對象的指針的函數。唯一的區別是元功能僅在編譯時存在。 boost::mpl::transform是這種高階元函數的一個例子。