在C++ 11具有保护类,它负责调用的范围出口的一些成员函数:专营成员指针模板参数分辨率
template <class T, void (T::*op)()>
struct Guard
{
Guard(T*g):
_g(g){}
~Guard()
{
(_g->*op)();
}
T*_g;
};
用法很简单:
typedef Guard<Foo, &Foo::bar> FooGuard;
...
FooGuard g(&foo);
我的问题起源于现有的shared_ptr<Foo>
。如何创建专业化,保持的T*
shared_ptr<T>
代替
我已经尝试过:
template <class T, void (T::*op)()>
struct Guard<std::shared_ptr<T>, op>
{
Guard(std::shared_ptr<T>& g):
_g(g){}
~Guard()
{
((*_g).*op)();
}
std::shared_ptr<T> _g;
};
但是在编译期间G<std::shared_ptr<Foo>, &Foo::bar> g2(foo);
有可预见的了:
错误C2440: '专业化':不能从'重载函数'转换为'void(__thiscall std :: shared_ptr :: *)(void)'
'_g-> OP();'是否行得通呢? –
@DavidHaim在哪里? – Dewfy
在析构函数中 –