Есть ли лучший способ сделать этот программный поток - PullRequest
0 голосов
/ 18 января 2019

У меня есть несколько функций, которые пытаются оценить некоторые данные. Каждая функция возвращает 1, если она может успешно оценить данные, или 0, если она не может. Функции вызываются одна за другой, но выполнение должно прекратиться, если одна из них возвращает значение 1.

Примеры функций выглядят так:

int function1(std::string &data)
{
    // do something
    if (success)
    {
        return 1;
    }
    return 0;
}

int function2(std::string &data)
{
    // do something
    if (success)
    {
        return 1;
    }
    return 0;
}
... more functions ...

Как бы был самый ясный способ организовать этот поток? Я знаю, что могу использовать операторы if как таковые:

void doSomething(void)
{
    if (function1(data))
    {
        return;
    }
    if (function2(data))
    {
        return;
    }
    ... more if's ...
}

Но это кажется многословным и имеет огромное количество слов, которые нужно набрать. Другой вариант, о котором я подумал, - это вызвать следующую функцию из возвращаемого 0 функции, например:

int function1(std::string &data)
{
    // do something
    if (success)
    {
        return 1;
    }
    return function2(data);
}

int function2(std::string &data)
{
    // do something
    if (success)
    {
        return 1;
    }
    return function3(data);
}
... more functions ...

Делаем вызов чище, потому что вам нужно только вызвать функцию1 (), чтобы оценить, насколько вам нужно, но, кажется, сделать код сложнее в обслуживании. Если в середину потока необходимо вставить еще одну проверку или изменить порядок вызовов, то все функции после новой необходимо будет изменить, чтобы учесть ее.

Я упускаю какой-то умный ясный способ C ++ для достижения такого рода потока программ или это один из этих методов лучше всего. Сейчас я склоняюсь к методу if, но чувствую, что что-то упустил.

Ответы [ 2 ]

0 голосов
/ 18 января 2019

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

std::vector<std::function<bool(std::string&)> listCheckers;

listCheckers.push_back([](std::string& p_data) -> bool { return function1(p_data); });
listCheckers.push_back([](std::string& p_data) -> bool { return function2(p_data); });
listCheckers.push_back([](std::string& p_data) -> bool { return function3(p_data); });
//...and so on...

//----------------------------- 
std::string theData = "Hello I'm a Data";

//evaluate all data
bool bSuccess = false;
for(fnChecker : listCheckers){
    if(fnChecker(theData)) {
        bSuccess = true;
        break;
    }
}

if(bSuccess ) { cout << "A function has evaluated the data successfully." << endl; }

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

0 голосов
/ 18 января 2019
void doSomething() {
    function1(data) || function2(data) /* || ... more function calls ... */;
}
Оператор

Logical-or || имеет нужные вам свойства - оценивается слева направо и останавливается, как только один операнд равен true.

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