Почему так не работает
// 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-й бы тоже сгодился если по другому никак.
Не хочется заводить лишнюю переменную там, где она не нужна.
Здравствуйте, _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;
}
Здравствуйте, Alexey F, Вы писали:
AF>Похоже, он (BOOST_SCOPE_EXIT) для таких целей (запуска без переменных) не предназначен .
Вот и я думаю о том же..
Простейший вариант, а не работает. Обидно
Надеюсь, в следующей версии можно будет так использовать.
Здравствуйте, _nn_, Вы писали:
__>Почему так не работает
__>__>// 1.
__>BOOST_SCOPE_EXIT()
__>{
__> puts("Exit");
__>} BOOST_SCOPE_EXIT_END
__>
Я уже не помню все детали, но я что-то делаю с последовательностью, что не дает использовать(). А BOOST_PP_EMPTY() помогает? Хотя конечно это не идеал.
Здравствуйте, 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 или сделать проверку на пустую последовательность
Как это не работает, я очень часто так пишу и всё прекрасно работает. Может быть вы используете 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-й бы тоже сгодился если по другому никак.
__>Не хочется заводить лишнюю переменную там, где она не нужна.
Здравствуйте, TarasKo, Вы писали:
TK>Как это не работает, я очень часто так пишу и всё прекрасно работает. Может быть вы используете BOOST_SCOPE_EXIT внутри шаблона. Там тогда надо использовать BOOST_SCOPE_EXIT_TPL.
struct a
{
void f()
{
BOOST_SCOPE_EXIT()
{
puts("A");
}
}
};
VC 9.0
Проверил
#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;
Здравствуйте, 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())
Макрос вызвать без параметров просто нельзя.