scoped sentry



  • Hallo,

    folgender Code compiliert im MSVC und tut das was er soll:

    template< typename T >
    struct sentry_type
    {
        typedef typename T::value_type V;
    
    	sentry_type( T& parent ) : parent_(parent), old_(parent.get()) {}
    	~sentry_type() { parent_.set(old_); }
    private:
    	T& parent_;
    	V old_;
    };
    
    template< typename T >
    struct getter_base
    {
    	typedef T value_type;
        typedef getter_base<T> this_type;
    
        getter_base() : value_(value_type()) {}
    
    	sentry_type< this_type > make_sentry() { return sentry_type<this_type>(*this); }
              
    	void reset() { value_ = value_type(); }
    	void set() { value_ = !value_type(); }
    	void set( value_type value ) { value_ = value; }
    	value_type get() const { return value_; }
    private:
    	value_type value_;
    };
    
    struct member_unsigned : getter_base<unsigned> {};
    
    struct foo
    {
    	member_unsigned m_unsigned;
    
    	sentry_type<member_unsigned> make_sentry_unsigned()
    	{
    		return sentry_type<member_unsigned>(m_unsigned);
    	}
    };
    
    #include <iostream>
    
    int main()
    {
    	foo bar;
    	bar.m_unsigned.set( 5 );
    	std::cout << bar.m_unsigned.get() << std::endl;
    
    	{
    		sentry_type<member_unsigned> scoped_sentry = bar.make_sentry_unsigned();
    		bar.m_unsigned.set( 13 );
    		std::cout << bar.m_unsigned.get() << std::endl;
    	}
    
    	std::cout << bar.m_unsigned.get() << std::endl;
    }
    

    Sinn sollte offensichtlich sein.

    Mein uralt gcc (arduino) meldet mir could not convert sentry_type<getter_base<unsigned> to sentry_type<member_unsigned>
    So wie es hier steht, geht es auch mit nem typedef statt einer abgeleiteten Klasse. Ich habe mir das aber gerade gebaut, damit ich im setter noch was anderes machen kann...

    z.b. habe ich so etwas:

    struct error_t : getter_base<error::type>
    {
    	void set( value_type value )
    	{
    		MAKE_LOG_MESSAGE( "set ERROR #" + string_fct::to_string(value) );
    		if( have() )
    		{
    			MAKE_LOG_MESSAGE( "ERROR before #" + string_fct::to_string(get()) );
    		}
    
    		getter_base<error::type>::set(value);
    	}
    
    	bool have() const { return get() != error::ok; }
    };
    

    Frage: Was nun? Hab ich nen Fehler gemacht und nimmt MSVC es nur weil es nun mal der MSVC ist?^^ Gibts nen schöneren Weg? Gibts nen workaround für nen 5.4.0 g++?

    bb



  • nvm. wald; bäume; ... ihr wisst schon^^

    edit hab ich keins gesehen - gibts da keins mehr?! : /

    problem ist die make_sentry< > funktion, die ich in getter_base habe. die ist natürlich unnötig und die hab ich im arduino-projekt auch aufgerufen und deshalb wollte der g++ es nicht nehmen.

    ciao



  • @unskilled sagte in scoped sentry:

    edit hab ich keins gesehen - gibts da keins mehr?! : /

    Wenn du eingeloggt bist, gibt es unter den drei vertikalen Punkten rechts unter deinen Beiträgen einen Menüpunkt "Bearbeiten".