В ходе теста, после больших блоков проверяю, не была ли нажата кнопка СТОП. Есть такая секция с if
if (m_stopTest)
{
manualStopTest(); // Выключаем все
//...
return; // Выходим из теста
}
Можно ли как-то правильно оформить, данную секцию, например, в функцию, чтоб менять то, что вложено в одном месте? Например, мысли такие
if (checkStop(m_stopTest)) return;
Где checkStop
в себя включает все те проверки и вызовы. Но тогда не логично, что checkStop
проверяет, и еще что-то там включает, выключает.
Вы хотите что-то такое?
bool checkStop(bool m_stopTest)
{
if (m_stopTest)
{
manualStopTest();
return true;
}
return false;
}
Для решения вашей проблемы "прокидывания" return
в вышестоящую функцию я вижу, как минимум, три варианта:
Использовать функцию-предикат и передавать в неё подходящий параметр: флаг (как это продемонстрировал Harry в своём ответе) или даже дополнительно функцию, которую нужно выполнить, типа manualStopTest
:
using F = void (*)();
bool checkStop(bool stop, F f)
{
if (stop)
{
f();
return true;
}
return false;
}
Использование:
if (checkStop(m_stopTest, &manualStopTest)) return;
В этом случае return
как бы передаётся по цепочке: return true;
внутри checkStop
приводит к return
из функции верхнего уровня.
Использовать макроподстановку:
#define COND_RET(cond) \
if ((cond)) \
{ \
manualStopTest(); \
return; \
}
Пример:
// какие-то действия ...
COND_RET(m_stopTest)
В этом случае return
один единственный, то это скорее C-стиль, нежели C++. Лучше избегать макросов, если в языке есть подходящие замены. В данном случае inline
реализация функции из п.1 будет смотреться лучше.
Выкинуть исключение во вложенной функции и поймать его уже где-то выше:
void checkStop(bool stop, F f)
{
if (stop)
{
f();
throw stopRequested();
}
}
Использование:
// Код высшего уровня
try {
// Вызов кода верхнего уровня, т.е. функции, содержащей вызов checkStop
}
catch(...) {
// Нужная обработка, может быть просто игнорирование
}
Такой вариант я тем не менее всё равно не стал бы советовать, т.к. использовать исключения для ветвления логики не принято. Как из-за лишнего оверхеда, так и по самой идеологии исключений, которые созданы для разруливания действительно исключетельных ситуаций.
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
С помощью хороших людей вроде разобрался с тем как пользоваться ffmpeg для encodeВозникла следующая проблема, при записи в файл данных с микрофона...
Функция разрешения входящего соединения через сокет формирует дескриптор нового сокета, возвращая значение типа SOCKET
Я установил IDE NetBeans 82 и теперь стоит задача реализовать в приложении локальную базу