#ifndef FLAGASSISTANT_H#define FLAGASSISTANT_H/// Дефайн для быстрого взведения флага спомощью класса CFlagAssistant. #define COCKFLAG(flagName) CFlagAssistant flagAssistant(&flagName); /*! \brief Класс автоматического взведения и сброса флага.* \author SASA.* \date 2010/08/18*/class CFlagAssistant{public: /*! \brief Конструктор. * \param[in] _flag (\c bool *) - Указатель на флаг, за которым следим. */ CFlagAssistant(bool * _flag) { m_flag = _flag; if(m_flag) *m_flag = true; } ~CFlagAssistant() { if(m_flag) *m_flag = false; }protected: bool * m_flag; ///< Флаг за которым следим.};#endif // FLAGASSISTANT_H
class MyClass{public: MyClass() { m_flag = false; } /*! Пока исполняется этот метод, флаг должен быть взведённым. * После выхода из метода, флаг должен сброситься. */ void metod() { COCKFLAG(m_flag); много кода c несколькими ретурнами; }protected: m_flag;};
C++ (Qt)void MyClass::CalcSomething( void ){ mPortalActive = true; if (!Check1()) { mPortalActive = false; return; } ... if (!Check2()) { mPortalActive = false; return; } ... mPortalActive = false;}
C++ (Qt)void MyClass::CalcSomething( void ){ CAutoFlag theFlag(&mPortalActive); if (!Check1()) return;... if (!Check2()) return;...}
C++ (Qt)#pragma once /*! Use this scoped class to temporarely change some value and restore old value when scope out. \code bool block; { scoped_value_change<bool> s(block, true, block); ... } ... std::string status; { scoped_value_change<std::string> s(flag, "entered", "leaved"); ... } \endcode */template <typename T>class scoped_value_change{public: scoped_value_change(T& value, const T& in, const T& out) : value_(value), out_(out) { value_ = in; } ~scoped_value_change() { value_ = out_; }private: T& value_; T out_;};
bool my_flag = true;{ scoped_value_change<bool> sv(my_flag, false, my_flag); // my_flag = false}// my_flag = true
scoped_value_change<bool> s(block, true, block);
scoped_value_change<bool>(block, true, block);
scoped_value_change(T& value, const T& out): value_(value), out_(out){}
C++ (Qt)#pragma once #include <boost/call_traits.hpp> /*! Use this scoped class to temporarely change some value and restore old value when scope out. \code bool flag; { scoped_value_change<bool> s(flag, true, flag); ... // or scoped_value_change<bool> s(flag, true); ... // or even SCOPE_COCK_FLAG(flag); ... } \endcode */ /*! Temporarely set a flag to true and return old flag value when the scope is out.*/#define SCOPE_COCK_FLAG(flag) scoped_value_change<bool> __sv_##flag(flag, true) /*! Temporarely set a flag to false and return old flag value when the scope is out.*/#define SCOPE_RESET_FLAG(flag) scoped_value_change<bool> __sv_##flag(flag, false) template <typename T>class scoped_value_change{public: typedef typename boost::call_traits<T>::reference reference; typedef typename boost::call_traits<T>::param_type param; scoped_value_change(reference value, param in) : value_(value), out_(value) { value_ = in; } scoped_value_change(reference value, param in, param out) : value_(value), out_(out) { value_ = in; } ~scoped_value_change() { value_ = out_; }private: reference value_; T out_;};