在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
在析構函數中 –