我正在处理一个项目,在对类的成员对象执行某些操作后必须保存一个文件。有时我们希望在一次操作后保存文件,有时我们需要在执行了一批操作之后才保存它。
我的想法是使用一个基本上像递归互斥锁一样工作的类。除了不锁定和解锁互斥锁,我希望类在堆栈中类的最后一个实例超出范围时调用一个方法(在本例中为保存文件)。
实现一个执行此操作的类不是问题,但这感觉像是我在 Boost 或 STL 中找不到的一般问题。这个问题是否有预先存在的标准解决方案,或者我需要推出自己的类(class)来解决这个问题?如果是这样,我的方法是否正确,或者是否有更好的方法来解决问题?
下面是我正在寻找的那种行为的简单实现。它只会打印“Hello World!”两次,即使 DoItOnce() 被调用了 11 次。我想通过从公认的标准中提取类似 GenericGuard
的东西来使用它,而不是将我自己的实现粘贴到代码库中。这可能吗?
#include <iostream>
void Noop (void) { }
void HelloWorld (void) { std::cout << "Hello World!" << std::endl; }
// This is what I imagine a generic implementation would look like...
template <void (*InitFunc)(), void (*DestructFunc)()>
class GenericGuard
{
int & _i;
public:
GenericGuard (int & i) : _i(i) { if (_i++ == 0) { InitFunc(); } }
~GenericGuard () { if (--_i == 0) { DestructFunc(); } }
};
int HelloWorldCounter; // Use a factory class in real-world?
typedef GenericGuard<Noop, HelloWorld> HelloWorldGuard;
void DoSomethingOnce (void)
{
HelloWorldGuard G (HelloWorldCounter);
// Do something
}
void DoItTenTimes (void)
{
HelloWorldGuard G (HelloWorldCounter);
for (int i = 0; i < 10; ++i)
{
DoSomethingOnce();
}
}
int main (void)
{
DoSomethingOnce();
DoItTenTimes();
return 0;
}
最佳答案
您可以将 shared_ptr
与自定义删除函数一起使用。
- STL(自 c++11 起):http://en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr
- boost :http://www.boost.org/doc/libs/1_55_0/libs/smart_ptr/shared_ptr.htm#deleter_constructor
示例:
#include <memory>
#include <iostream>
void HelloWorld(void *) { std::cout << "Hello World!" << std::endl; }
class factory
{
public:
static std::shared_ptr<void> get_instance()
{
static std::weak_ptr<void> ref;
if (ref.expired())
{
std::shared_ptr<void> sp{nullptr, HelloWorld};
ref = sp;
return sp;
}
return ref.lock();
}
};
void DoSomethingOnce (void)
{
std::shared_ptr<void> G = factory::get_instance();
// Do something
}
void DoItTenTimes (void)
{
std::shared_ptr<void> G = factory::get_instance();
for (int i = 0; i < 10; ++i)
{
DoSomethingOnce();
}
}
int main(void)
{
DoSomethingOnce();
DoItTenTimes();
return 0;
}
关于c++ - 类似于嵌套互斥体但更通用的东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24389379/