Is there a standalone implementation of std::function?

前端 未结 2 1431
盖世英雄少女心
盖世英雄少女心 2021-01-04 05:51

I\'m working on an embedded system, so code size is an issue. Using the standard library ups my binary size by about 60k, from 40k to 100k. I\'d like to use std::function, b

2条回答
  •  渐次进展
    2021-01-04 06:28

    Here is simple implementation of std::function-like class template without inclusion of any headers. You can customize the behavior as you wish(like move/forward, empty call response, etc):

    live_demo

    // Scroll down for example of usage
    namespace bicycle
    {
        template
        struct abstract_function
        {
            virtual Result operator()(Args... args)=0;
            virtual abstract_function *clone() const =0;
            virtual ~abstract_function() = default;
        };
    
        template
        class concrete_function: public abstract_function
        {
            Func f;
        public:
            concrete_function(const Func &x)
                : f(x)
            {}
            Result operator()(Args... args) override
            {
                return f(args...);
            }
            concrete_function *clone() const override
            {
                return new concrete_function{f};
            }
        };
    
        template
        struct func_filter
        {
            typedef Func type;
        };
        template
        struct func_filter
        {
            typedef Result (*type)(Args...);
        };
    
        template
        class function;
    
        template
        class function
        {
            abstract_function *f;
        public:
            function()
                : f(nullptr)
            {}
            template function(const Func &x)
                : f(new concrete_function::type,Result,Args...>(x))
            {}
            function(const function &rhs)
                : f(rhs.f ? rhs.f->clone() : nullptr)
            {}
            function &operator=(const function &rhs)
            {
                if( (&rhs != this ) && (rhs.f) )
                {
                    auto *temp = rhs.f->clone();
                    delete f;
                    f = temp;
                }
                return *this;
            }
            template function &operator=(const Func &x)
            {
                auto *temp = new concrete_function::type,Result,Args...>(x);
                delete f;
                f = temp;
                return *this;
            }
            Result operator()(Args... args)
            {
                if(f)
                    return (*f)(args...);
                else
                    return Result{};
            }
            ~function()
            {
                delete f;
            }
        };
    }
    
    // ___________________[ Example of usage ]___________________ //
    
    int func1(double)
    {
        return 1;
    }
    struct Functor2
    {
        int operator()(double)
        {
            return 2;
        }
    };
    
    double func3(bool,int)
    {
        return 3.0;
    }
    struct Functor4
    {
        double operator()(bool,int)
        {
            return 4.0;
        }
    };
    
    int main()
    {
        int res = 10;
        {
            bicycle::function f{func1};
    
            res -= f(1.0);
            f = Functor2{};
            res -= f(2.0);
        }
        {
            bicycle::function f1;
            f1 = func3;
    
            bicycle::function f2{f1};
            res -= f2(true,1);
    
            f1 = Functor4{};
            f2 = f1;
            res -= f2(false,2);
        }
        return res;
    }
    

提交回复
热议问题