diff --git a/test.cpp b/test.cpp index a0b6324..0b4e577 100644 --- a/test.cpp +++ b/test.cpp @@ -127,22 +127,80 @@ namespace detail } */ +template +class MoveCaptureLamda; + +template +class MoveCaptureLamda + < + fu::identity, + fu::identity, + fu::sequence, + fu::sequence + > +{ + std::function _functional; + + std::tuple _capture; + +public: + MoveCaptureLamda(std::function&& functional, Capture&&... capture) + : _functional(std::move(functional)), _capture(std::make_tuple(std::forward(capture)...)) { } + + void invoke(Args&&... args) + { + _functional(std::move(std::get(_capture))..., std::forward(args)...); + } +}; + +template +class MoveCaptureLamda + < + fu::identity, + fu::identity, + fu::sequence, + fu::sequence + > +{ + std::function _functional; + + std::tuple _capture; + +public: + MoveCaptureLamda(std::function&& functional, Capture&&... capture) + : _functional(std::move(functional)), _capture(std::make_tuple(std::forward(capture)...)) { } + + ReturnType invoke(Args&&... args) + { + return _functional(std::move(std::get(_capture))..., std::forward(args)...); + } +}; + template class continuable_returner { _CTy returning_continuable; public: + continuable_returner(continuable_returner&& right) + { + returning_continuable = std::move(right.returning_continuable); + } + continuable_returner(_CTy&& returning_continuable_) : returning_continuable(std::move(returning_continuable_)) { } - continuable_returner& operator= (continuable_returner&) = delete; - continuable_returner& operator= (continuable_returner&& right) + { + returning_continuable = std::move(right.returning_continuable); + return *this; + } + + continuable_returner& operator= (continuable_returner& right) { // returning_continuable = std::move(right.returning_continuable); return *this; - }; + } auto operator()(_ATy&&...) -> _CTy @@ -436,14 +494,29 @@ int main(int /*argc*/, char** /*argv*/) conv_test_1(1, 1); + /* + continuable_returner> test26151_start(std::unique_ptr(new int(5))); - continuable_returner> fn(std::unique_ptr(new int(5))); + continuable_returner> test26151_moved = std::move(test26151_start); - continuable_returner> other_fn = std::move(fn); + std::function()> test26151_fn = std::move(test26151_moved); + */ // static_assert(fu::is_unwrappable::value, "not unwrappable!"); // std::function fntest = std::move(fn); + MoveCaptureLamda>, fu::identity, fu::sequence_of_t<1>, fu::sequence_of_t<0>> capture([](std::unique_ptr) + { + + int i = 0; + + ++i; + + }, std::unique_ptr(new int(90))); + + capture.invoke(); + + capture.invoke(); return 0; }