c++ - 是否有 std::function 的独立实现?

标签 c++ stl functional-programming embedded

我正在开发嵌入式系统,因此代码大小是一个问题。使用标准库将我的二进制大小增加了大约 60k,从 40k 增加到 100k。我想使用 std::function,但我不能证明它是 60k 的。是否有我可以使用的独立实现,或类似的东西?我正在使用它在 c++ 11 中使用绑定(bind)变量在成员函数中隐式转换 lambda。

最佳答案

这是 std::function-like 类模板的简单实现,不包含任何标题。您可以根据需要自定义行为(如移动/前进、空调用响应等):

live_demo

// Scroll down for example of usage
namespace bicycle
{
    template<typename Result,typename ...Args>
    struct abstract_function
    {
        virtual Result operator()(Args... args)=0;
        virtual abstract_function *clone() const =0;
        virtual ~abstract_function() = default;
    };

    template<typename Func,typename Result,typename ...Args>
    class concrete_function: public abstract_function<Result,Args...>
    {
        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<typename Func>
    struct func_filter
    {
        typedef Func type;
    };
    template<typename Result,typename ...Args>
    struct func_filter<Result(Args...)>
    {
        typedef Result (*type)(Args...);
    };

    template<typename signature>
    class function;

    template<typename Result,typename ...Args>
    class function<Result(Args...)>
    {
        abstract_function<Result,Args...> *f;
    public:
        function()
            : f(nullptr)
        {}
        template<typename Func> function(const Func &x)
            : f(new concrete_function<typename func_filter<Func>::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<typename Func> function &operator=(const Func &x)
        {
            auto *temp = new concrete_function<typename func_filter<Func>::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<int(double)> f{func1};

        res -= f(1.0);
        f = Functor2{};
        res -= f(2.0);
    }
    {
        bicycle::function<double(bool,int)> f1;
        f1 = func3;

        bicycle::function<double(bool,int)> f2{f1};
        res -= f2(true,1);

        f1 = Functor4{};
        f2 = f1;
        res -= f2(false,2);
    }
    return res;
}

关于c++ - 是否有 std::function 的独立实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14739902/

相关文章:

c++ - 混合 MFC 和 STL

javascript - 如何在 Javascript 函数式编程中做一个简单的计数器?

javascript - 为函数(带参数)分配变量名? [JavaScript]

c++ - 如何确定 C++ lambda 的结果类型(闭包类型)

c++ - 编译时似乎错误的代码(关于对象返回)

c++ - 在 clang 和 gcc 中移动可分配的 lambda

c++ - C++中如何用getter方法实现封装

c++ - 如何在 hpp 中声明一个 vector ?

c# - 将 STL/C++/CLI 容器传递给 .Net

c++ - bits/STL_tree.h中_Rb_tree_increment的定义是什么?