Макрос для цикла while с отложенным вызовом функции - PullRequest
0 голосов
/ 23 мая 2019

Я хотел бы создать макрос, в котором предопределенная функция (здесь имитируемая «вызовом здесь fcn») вызывается каждый раз, когда цикл завершает итерацию. Это то, что я до сих пор, что на самом деле работает.

Есть ли более короткий путь, в конце концов с большим количеством макромагиков, чтобы написать такое поведение?

#define MYWHILE(condition) \
        while(  \
          []()->bool {  \
          static bool called = false; \
          if(called) std::cout<<"call fcn here"<<std::endl; \
          called=true; return true;}() \
          && condition)

Этот макрос следует использовать в нескольких местах кода, чтобы никто не забыл вызвать функцию, когда они пишут занятые циклы ожидания.

Типичным примером будет:

while(true){

 bool b = foo();
 if(b){
   break;
 }

 ros::spinOnce(); 
}

Где часто вызывается ros::spinOnce(), поэтому я просто заменяю пример кода на:

MYWHILE(true){

  bool b = foo();
  if(b){
    break;
  }
}

Pure C - Код тоже подойдет.

Ответы [ 3 ]

0 голосов
/ 23 мая 2019

Вместо сложного цикла while вы можете упаковать то, что вам нужно, в цикл for:

for (; condition; fcn())

Функция будет вызываться в конце каждой итерации перед повторной оценкойсостояние.

0 голосов
/ 23 мая 2019

Что не так с просто:

while(!foo()) {
    ros::spinOnce();
}

Это логически эквивалентно:

while(true){
    bool b = foo();

    if(b){
        break;
    }
    ros::spinOnce(); 
}

Еще намного проще, чем:

MYWHILE(true){
    bool b = foo();

    if(b){
        break;
    }
}
0 голосов
/ 23 мая 2019

Я хотел бы создать макрос, в котором предопределенная функция (здесь имитируемая «вызовом здесь fcn») вызывается каждый раз, когда цикл завершает итерацию, но НЕ в первый раз.

Поскольку предоставленный вами код и ваш вопрос конфликтуют, неясно, какое поведение вы хотите.Для реализации вышеизложенного я бы рекомендовал вообще не использовать макросы, а просто написать свой код как:

do {
  if(!condition)
    break;

  // More code here

} while(fcn());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...