C ++在不为每种情况编写类的情况下使用RAII

时间:2016-12-09 10:50:58

标签: c++ templates member-function-pointers raii

利用RAII需要创建一个类,以便从退出作用域时自动调用自动变量的析构函数的机制中受益。

然而,在某些情况下,为了#34;发布"某些东西或未设置的东西似乎太多了。

例如,如果你有一个方法只在呼叫期间设置一个字段的值,那么你必须在调用返回或抛出时手动取消设置它,并且它不实用,直观地编写一个只会自动取消设置该字段的类,并且只能用于这种特殊情况。

所以我考虑过编写某种通用类,它可以在所有不值得上课的情况下使用RAII。

我们的想法是提供一个对象实例,一个在构造时调用的方法指针,以及一个在销毁时调用的方法指针:

template< class T >
class guard
{
private:

    T * const m_pInstance;

    void (T::* const m_fnInitialize)();

    void (T::* const m_fnFinalize)() throw();

public:

    guard( T * pInstance, void (T::* fnInitialize)(), void (T::* fnFinalize)() throw() ) :
        m_pInstance    ( pInstance    ),
        m_fnInitialize ( fnInitialize ),
        m_fnFinalize   ( fnFinalize   )
    {
        (m_pInstance->*m_fnInitialize)();
    }

    ~guard() throw()
    {
        (m_pInstance->*m_fnFinalize)();
    }
};

可以这样使用:

class some_class
{
private:

    int m_iField;

public:

    some_class() : m_iField( 0 )
    {
    }

    void set()
    {
        std::cout << "set()" << std::endl;
        m_iField = 1;
    }

    void unset() throw()
    {
        std::cout << "unset()" << std::endl;
        m_iField = 0;
    }
};

int main( int argc, char ** argv )
{
    some_class oObj;

    {
        core::guard< some_class > oGuard( & oObj, & some_class::set, & some_class::unset );
    }

    system( "pause" );

    return 0;
}

它让我觉得它很方便。但是你知道为什么这会是一种不好的做法吗?

我设计的方式也不完全是&#34;泛型&#34;因为它带来了一些约束:初始化和终结方法是非const的,并且终结方法可能不会抛出。有没有办法让这更灵活?

谢谢。

0 个答案:

没有答案