zoukankan      html  css  js  c++  java
  • C++函数装饰器

    今天在网上看到一个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;
    }

  • 相关阅读:
    1033.采药1
    G——胜利大逃亡 (BFS)
    POJ 3278 Catch That Cow
    C
    11.17 dfs poj1979 Red and Black
    11.11反思
    kmp笔记
    dfs bfs
    1113
    python 类方法
  • 原文地址:https://www.cnblogs.com/xjjsk/p/9275189.html
Copyright © 2011-2022 走看看