BOOST_SCOPE_EXIT
От: _nn_ www.nemerleweb.com
Дата: 17.02.10 16:23
Оценка:
Почему так не работает
// 1.
BOOST_SCOPE_EXIT()
{
  puts("Exit");
} BOOST_SCOPE_EXIT_END


А так работает:
// 2.
int dummy;
BOOST_SCOPE_EXIT( (dummy) )
{
  puts("Exit");
} BOOST_SCOPE_EXIT_END


А если передать даже пустую последовательность, то не работает все равно
// 3.
BOOST_SCOPE_EXIT( () )
{
  puts("Exit");
} BOOST_SCOPE_EXIT_END


Похоже нет проверок на пустую последовательность.
Вариант 1 предпочтительней всего, но 3-й бы тоже сгодился если по другому никак.

Не хочется заводить лишнюю переменную там, где она не нужна.
http://rsdn.nemerleweb.com
http://nemerleweb.com
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;
}
Re[2]: BOOST_SCOPE_EXIT
От: _nn_ www.nemerleweb.com
Дата: 17.02.10 17:41
Оценка:
Здравствуйте, Alexey F, Вы писали:

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

Вот и я думаю о том же..
Простейший вариант, а не работает. Обидно

Надеюсь, в следующей версии можно будет так использовать.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: BOOST_SCOPE_EXIT
От: alnsn Великобритания http://nasonov.blogspot.com
Дата: 17.02.10 17:47
Оценка:
Здравствуйте, _nn_, Вы писали:

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

__>
__>// 1.
__>BOOST_SCOPE_EXIT()
__>{
__>  puts("Exit");
__>} BOOST_SCOPE_EXIT_END
__>


Я уже не помню все детали, но я что-то делаю с последовательностью, что не дает использовать(). А BOOST_PP_EMPTY() помогает? Хотя конечно это не идеал.
Re[2]: BOOST_SCOPE_EXIT
От: _nn_ www.nemerleweb.com
Дата: 17.02.10 17:57
Оценка:
Здравствуйте, alnsn, Вы писали:

A>Здравствуйте, _nn_, Вы писали:


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

__>>
__>>// 1.
__>>BOOST_SCOPE_EXIT()
__>>{
__>>  puts("Exit");
__>>} BOOST_SCOPE_EXIT_END
__>>


A>Я уже не помню все детали, но я что-то делаю с последовательностью, что не дает использовать(). А BOOST_PP_EMPTY() помогает? Хотя конечно это не идеал.


В макросе используется BOOST_PP_SEQ_FOR_EACH_I, а он, как я понимаю, не умеет работать с пустой последовательностью.
Т.е. или добавить функционал в BOOST_PP_SEQ_FOR_EACH_I или сделать проверку на пустую последовательность
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: BOOST_SCOPE_EXIT
От: TarasKo Голландия  
Дата: 21.02.10 07:15
Оценка:
Как это не работает, я очень часто так пишу и всё прекрасно работает. Может быть вы используете BOOST_SCOPE_EXIT внутри шаблона. Там тогда надо использовать BOOST_SCOPE_EXIT_TPL.

Здравствуйте, _nn_, Вы писали:

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

__>
__>// 1.
__>BOOST_SCOPE_EXIT()
__>{
__>  puts("Exit");
__>} BOOST_SCOPE_EXIT_END
__>


__>А так работает:

__>
__>// 2.
__>int dummy;
__>BOOST_SCOPE_EXIT( (dummy) )
__>{
__>  puts("Exit");
__>} BOOST_SCOPE_EXIT_END
__>


__>А если передать даже пустую последовательность, то не работает все равно

__>
__>// 3.
__>BOOST_SCOPE_EXIT( () )
__>{
__>  puts("Exit");
__>} BOOST_SCOPE_EXIT_END
__>


__>Похоже нет проверок на пустую последовательность.

__>Вариант 1 предпочтительней всего, но 3-й бы тоже сгодился если по другому никак.

__>Не хочется заводить лишнюю переменную там, где она не нужна.
Re[2]: BOOST_SCOPE_EXIT
От: _nn_ www.nemerleweb.com
Дата: 21.02.10 07:33
Оценка:
Здравствуйте, TarasKo, Вы писали:

TK>Как это не работает, я очень часто так пишу и всё прекрасно работает. Может быть вы используете BOOST_SCOPE_EXIT внутри шаблона. Там тогда надо использовать BOOST_SCOPE_EXIT_TPL.


struct a
{
 void f()
 {
   BOOST_SCOPE_EXIT()
   {
     puts("A");
   }
 }
};


VC 9.0
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: BOOST_SCOPE_EXIT
От: TarasKo Голландия  
Дата: 21.02.10 07:35
Оценка:
Проверил

#include <boost/scope_exit.hpp>
#include <iostream>

using namespace std;

int main() {
    BOOST_SCOPE_EXIT()
    {
        cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
    } BOOST_SCOPE_EXIT_END

    return 0;
}


g++ 4.3.4 скомпилировал нормально. Но если у вас он упорно не хочет, то можно и по старинке. Параметров всё равно ж нет, кода будет не намного больше


struct on_scope_exit {
    ~on_scope_exit() {    
        cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
    }
} _on_scope_exit;
Re[3]: BOOST_SCOPE_EXIT
От: _nn_ www.nemerleweb.com
Дата: 21.02.10 07:46
Оценка:
Здравствуйте, TarasKo, Вы писали:

TK>Проверил


TK>
TK>#include <boost/scope_exit.hpp>
TK>#include <iostream>

TK>using namespace std;

TK>int main() {
TK>    BOOST_SCOPE_EXIT()
TK>    {
TK>        cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
TK>    } BOOST_SCOPE_EXIT_END

TK>    return 0;
TK>}
TK>


TK>g++ 4.3.4 скомпилировал нормально. Но если у вас он упорно не хочет, то можно и по старинке. Параметров всё равно ж нет, кода будет не намного больше


Странновато как-то.
#define BOOST_SCOPE_EXIT(seq) \
    BOOST_SCOPE_EXIT_AUX_IMPL(__LINE__, seq, BOOST_PP_EMPTY())

Макрос вызвать без параметров просто нельзя.
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.