1. 程式人生 > >C++函數裝飾器

C++函數裝飾器

試用 after 比較 function 分享 成員函數 一個 生產 a+b

今天在網上看到一個python實現的函數裝飾器,嘗試用C++11實現了一下,最後很粗糙的完成了,代碼如下。

函數裝飾器:接受一個函數。將此函數進行一些裝飾,成為另一個函數。新生產的函數具有原函數的功能,另外還會做一些其他的功能。返回新函數。

技術分享圖片

由於Python中一切皆對象,把類型也當成對象看待,把函數的參數和返回值也當成對象看待,所以很容易就實現出來。而c++是一門靜態類型語言,編譯器做類型檢查,執行期間沒有類型相關的信息(除了RTTI)。所以實現起來比較麻煩,只能使用模板、函數指針、可變參數、函數對象、lambad等知識實現。而類裝飾器就更難了。

最近還聽說Go語言使用協程實現線程庫,也是醉了。比我還奇葩。

#include <iostream>
#include <functional>
#include <stdarg.h>

void do_previous_work() {/*do some thing*/}
void do_after_work() {/*do some thing*/ }

//函數裝飾器:輸入一個函數,將此函數包裝後返回包裝後的函數,函數類型不變。
template<typename FUN_RESULT, typename ... FUN_ARGS>
std::function<FUN_RESULT(FUN_ARGS ... args)> decorator(FUN_RESULT(*p_func)(FUN_ARGS ... args))
{
auto post = [&](FUN_ARGS ... args) -> FUN_RESULT {
do_previous_work();
FUN_RESULT result = (*p_func)(args...);
do_after_work();
return result;
};
return post;
}
//思考:類包裝器,將類包裝後,類的每一個成員函數都被裝飾器裝飾。
int test(int a, double b) { return a+b; }
int main() {
int a = 1;
double b = 2;
auot f = decorator(test);//傳入函數入口地址,返回裝飾後的函數對象。
f(a, b);
system("pause");
return 0;
}

C++函數裝飾器