組合函式是將n個一元函式組成一種更複雜的函式,每個函式的返回值作為引數傳給下乙個函式,直到傳到最後乙個函式結束。這種組合函式的能力可以使我們以一種更直觀的方式去完成複雜的鏈式執行行為。例如有三個函式:
int f(int x), int g(int y), int h(int z)
依次呼叫三個函式
int a,b,c,parm;
a = f(parm);
b = g(a);
c = h(b);
等價於 c = h(g(f(parm)));
這種方式在使用起來不夠簡潔方便,如果能把這些簡單函式組合起來,就可以按簡單函式的方式去呼叫了,更加直觀和簡潔。比如像這樣呼叫:
compose(f,g,h)(parm);
這種方式把這些函式串在一起了,內部是乙個接乙個呼叫並得到最終結果。
在c++中如何實現這種組合函式的呼叫呢?想想我們應該怎麼做吧。我們先分析一下這種組合函式的呼叫的特點:
通過上面的分析我們知道這種組合函式有個隱含的約束就是,返回值和入參必須相同,這也導致這些函式只能是一元函式。
如果希望有多個入參,則要通過變通的方式了,比如可以將乙個結構體作為入參,類似於data_struct f(data_struct)來實現多個入參的問題。
好了現在看看c++中是如何實現這種呼叫的吧。
template class composed
public:
template auto operator()(arg arg) -> decltype(declval()((declval()(declval()))))
private:
innerfn m_innerfn;
outerfn m_outerfn;
};template composedcompose(function1 f1, function2 f2)
template auto compose(function1 f1, function2 f2, function3 f3, functions... fs)->decltype(compose(compose(f1, f2), f3, fs...))
測試**:
void testcompose()
; auto g1 = (int b);
auto h1 = (int c);
auto i1 = (int d);
auto j1 = (int e);
auto ret = compose(f1, g1, h1)(3);
ret = compose(f1, g1, h1, i1)(3);
ret = compose(f1, g1, h1, i1, j1)(3);
ret = compose(f1, g1, h1, i1, j1, j1, j1)(3);
ret = compose((int d), (int d))(3);
}
對於compose那裡之前的**在gcc下編譯不過,原因是因為gcc和vs2013對於變參的展開規則不太一樣導致的,gcc的展開規則更嚴格。
完整測試**:
#include #include using namespace std;
template class composed
public:
template auto operator()(arg arg) -> decltype(declval()((declval()(declval()))))
private:
innerfn m_innerfn;
outerfn m_outerfn;
};template composedcompose(function1 f1, function2 f2)
template auto compose(function1 f1, function2 f2, function3 f3, functions... fs)->decltype(compose(compose(f1, f2), f3, fs...))
void testcompose()
; auto g1 = (int b);
auto h1 = (int c);
auto i1 = (int d);
auto j1 = (int e);
auto ret = compose(f1, g1, h1)(3);
ret = compose(f1, g1, h1, i1)(3);
cout << ret << endl;
ret = compose(f1, g1, h1, i1, j1)(3);
cout << ret << endl;
ret = compose(f1, g1, h1, i1, j1, j1, j1)(3);
cout << ret << endl;
ret = compose((int d), (int d))(3);
cout << ret << endl;
}int main()
C 標準庫 組合型仿函式
一元組合函式配接器 最簡單的組合型函式配接器,是將某個一元運算結果作為另外乙個一元運算的輸入。其實這只不過是巢狀呼叫兩個一元仿函式。例如,如果你要構造乙個運算 先加10再乘以4 就會用到這個函式配接器。示例 compose f gx t include include include include...
6 5 2 C 中的函式組合
6.5.2 c 中的函式組合 c 中的函式組合是可能的,但使用非常有限,這是部分是由於在 c 中散應用不能很容易使用,但更重要的是,因為大多數操作是用成員來寫的,而不是函式。但我們至少可以用 c 演示同樣的想法,清單 6.18 顯示了 compose 方法的實現,以及使用的示例。清單 6.18實現並...
C 中類的組合與建構函式
首先看看建構函式的概念。在程式執行過程中,當遇到物件宣告語句時,程式會想作業系統申請一定的記憶體空間用於存放新建的物件。而編譯器不知道如何產生 來實現初始化。所以c 做了一套物件初始化的機制,就是建構函式。然後是類的組合中,當建立類的物件時,如果這個類具有內嵌物件成員,那麼各個內嵌物件將首先被自動建...