#include <iostream>
#include <memory>
#include <functional>
class OperationGuard final {
public:
template<typename Func, typename... Args>
OperationGuard(Func func, Args&&... args)
:functor_(std::bind(std::move(func), std::forward<Args>(args)...))
{
}
void releaseControl(bool releaseCondition = true)
{
control_ = !releaseCondition;
}
OperationGuard& operator=(OperationGuard&&) = delete;
OperationGuard(OperationGuard&& rhs): functor_(std::move(rhs.functor_))
{
control_ = rhs.control_;
rhs.control_ = false;
}
~OperationGuard() noexcept
{
if (control_) {
try {
functor_();
} catch (...) {
}
}
}
private:
std::function<void()> functor_;
bool control_ = true;
};
void testFunc(int x, int y) {
std::cout << "func1: " << x + y << std::endl;
}
void testPtrFunc(std::unique_ptr<int> param)
{
if (param.get() != nullptr) {
std::cout << "testGlobalPtrFunc: param=" << * param << std::endl;
}
}
int main()
{
{
OperationGuard opGuard(&testFunc, 1, 2);
}
// {
// std::unique_ptr<int> param = std::make_unique<int>(10);
// OperationGuard opGuard(&testPtrFunc, std::move(param));
// }
return 0;
}
搜了下发现std::function不支持std::unique_ptr类型的参数,原因是std::unique_ptr的拷贝构造给禁用了。有啥好办法解决?
https://stackoverflow.com/questions/20268482/binding-functions-with-unique-ptr-arguments-to-stdfunctionvoid
https://stackoverflow.com/questions/8640393/move-capture-in-lambda/20669290#20669290