Re: BOOST_SCOPE_EXIT
От: Alexey F  
Дата: 17.02.10 17:25
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Почему так не работает

[...skip...]
__>А так работает:

В выводе препроцессора видно, что всё сделано специально для того, чтобы сохранить ссылку на переменную.
Из такого кода:
#include <iostream>
#include <boost/scope_exit.hpp>

int main () {
    int my_some_Variable = 42;
    BOOST_SCOPE_EXIT ( ( my_some_Variable ) ) {
        my_some_Variable = 128;
    } BOOST_SCOPE_EXIT_END
}

получаем такой (g++, плохо вычищено):
  Скрытый текст
int main () {
 int my_some_Variable = 42;
 typedef void (*boost_se_tag_0_6)(int my_some_Variable);
 
 typedef __typeof__(boost::type_of::ensure_obj(boost::scope_exit::aux::wrap( boost::scope_exit::aux::deref(my_some_Variable, (boost_se_tag_0_6)0)))) boost_se_wrapped_t_0_6;
 
 typedef boost_se_wrapped_t_0_6::type boost_se_capture_t_0_6;
 
 struct boost_se_params_t_6 {
    typedef boost_se_capture_t_0_6 boost_se_param_t_0_6;
    boost::scope_exit::aux::member< boost_se_param_t_0_6, boost_se_tag_0_6 > boost_se_param_0_6;
    
 } boost_se_params_6 = {
    { boost::scope_exit::aux::deref(my_some_Variable, (boost_se_tag_0_6)0) }
};
 boost::scope_exit::aux::declared< boost::scope_exit::aux::resolve< sizeof(boost_scope_exit_args)>::cmp1<0>::cmp2 > boost_scope_exit_args;
 boost_scope_exit_args.value = &boost_se_params_6;
 struct boost_se_guard_t_6 { boost_se_params_t_6* boost_se_params_;
 boost_se_guard_t_6 (void* boost_se_params) : boost_se_params_( (boost_se_params_t_6*)boost_se_params) {} ~boost_se_guard_t_6() { boost_se_body( boost_se_params_->boost_se_param_0_6.value );
 } static void boost_se_body( boost_se_params_t_6:: boost_se_param_t_0_6 my_some_Variable ) {
  my_some_Variable = 128;
 } } boost_se_guard_8 ( boost_scope_exit_args.value);
}


Похоже, он (BOOST_SCOPE_EXIT) для таких целей (запуска без переменных) не предназначен .

Можно, конечно, сделать простой велосипед:
#include <boost/preprocessor/cat.hpp>

#define LIGHT_SCOPE_EXIT \
    struct BOOST_PP_CAT ( local_struct_, __LINE__ ) { \
        BOOST_PP_CAT ( ~local_struct_, __LINE__ ) ()
        
#define LIGHT_SCOPE_EXIT_END \
    } BOOST_PP_CAT ( local_struct_var_, __LINE__ ); static_cast<void> ( BOOST_PP_CAT ( local_struct_var_, __LINE__ ) );


#include <cstdio>

int main () {
    LIGHT_SCOPE_EXIT {
        puts ( "One" );
    } LIGHT_SCOPE_EXIT_END;
    
    LIGHT_SCOPE_EXIT {
        puts ( "Two" );
    } LIGHT_SCOPE_EXIT_END;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.