more experiments

This commit is contained in:
Denis Blank 2015-07-15 00:58:30 +02:00 committed by Naios
parent 0c6e235d5f
commit ef3f494ba2

View File

@ -147,7 +147,7 @@ public:
MoveCaptureLamda(std::function<void(Capture..., Args...)>&& functional, Capture&&... capture)
: _functional(std::move(functional)), _capture(std::make_tuple(std::forward<Capture>(capture)...)) { }
void invoke(Args&&... args)
void operator() (Args&&... args)
{
_functional(std::move(std::get<SeqOfCapture>(_capture))..., std::forward<Args>(args)...);
}
@ -170,7 +170,7 @@ public:
MoveCaptureLamda(std::function<ReturnType(Capture..., Args...)>&& functional, Capture&&... capture)
: _functional(std::move(functional)), _capture(std::make_tuple(std::forward<Capture>(capture)...)) { }
ReturnType invoke(Args&&... args)
ReturnType operator() (Args&&... args)
{
return _functional(std::move(std::get<SeqOfCapture>(_capture))..., std::forward<Args>(args)...);
}
@ -209,6 +209,49 @@ public:
}
};
template<typename T>
class copymove
{
T _content;
bool consumed;
copymove& move(copymove& right)
{
// _content = std::move(right._content);
return *this;
}
copymove& move(copymove&& right)
{
// _content = std::move(right._content);
return *this;
}
public:
copymove(copymove const& right) : consumed(false)
{
// move(right._content);
}
copymove(T& right) : consumed(false)
{
_content = std::move(right);
}
copymove& operator= (copymove& right)
{
return move(right);
}
T get()
{
assert(!consumed && "already consumed!");
consumed = true;
return move(right._content);
}
};
int main(int /*argc*/, char** /*argv*/)
{
/*
@ -506,7 +549,8 @@ int main(int /*argc*/, char** /*argv*/)
// std::function<void(int)> fntest = std::move(fn);
MoveCaptureLamda<fu::identity<std::unique_ptr<int>>, fu::identity<void>, fu::sequence_of_t<1>, fu::sequence_of_t<0>> capture([](std::unique_ptr<int>)
MoveCaptureLamda<fu::identity<std::unique_ptr<int>>, fu::identity<void, int>, fu::sequence_of_t<1>, fu::sequence_of_t<0>> capture(
[](std::unique_ptr<int> capture, int arg)
{
int i = 0;
@ -515,8 +559,16 @@ int main(int /*argc*/, char** /*argv*/)
}, std::unique_ptr<int>(new int(90)));
capture.invoke();
capture(1);
capture(2);
std::unique_ptr<int> uptr(new int(90));
copymove<std::unique_ptr<int>> mycapture(std::move(uptr));
auto capt = [mycapture]
{
};
capture.invoke();
return 0;
}