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 = + std::cout << func(6, 3) << std::endl; return 0; }
[出力]
lambda 16 lambda 4 plus() 9
これを元に足りない部分やまずい部分を考察してみたい。