std::function を簡単に書いてみた

特に理由はないけど簡単に書いてみた。

[ソース]

#include <memory>

template<typename T>
using decay_t = typename std::decay<T>::type;

template<typename Sig>
class function;

template<typename R, typename ...Args>
class function<R(Args...)>{
    struct handler{
        virtual R operator()(Args... args) = 0;
    };
    std::shared_ptr<handler> handler_;

    template<typename Func>
    struct impl : handler{
        virtual R operator()(Args... args) override {
            return func(args...);
        }
        Func func;

        impl(Func const& func) : func(func){}
    };
public:
    function(){}

    template<typename Func>
    function(Func&& func) : handler_(std::make_shared<impl<decay_t<Func>>>(std::forward<Func>(func))){}
    
    template<typename Func>
    function const&
    operator =(Func&& func){
        handler_ = std::make_shared<impl<decay_t<Func>>>(std::forward<Func>(func));
        return *this;
    }

    R
    operator ()(Args... args){
        return (*handler_)(args...);
    }
};


#include <iostream>


int
plus(int a, int b){
    std::cout << "plus()" << std::endl;
    return a + b;
}

int
main(){
    ::function<int(int, int)> func;
    auto value = 10;
    func = [&](int a, int b){
        return a + b + value;
    };
    std::cout << func(2, 4) << std::endl;
    value = -2;
    std::cout << func(5, 1) << std::endl;
    func = &plus;
    std::cout << func(6, 3) << std::endl;
    return 0;
}

[出力]

lambda
16
lambda
4
plus()
9


これを元に足りない部分やまずい部分を考察してみたい。