Я работаю с АПИ системы. Все АПИ сообщают об ошибке через свой параметр, являющийся указателем на структуру. После вызова АПИ необходимо проверить, не произошла ли ошибка. Если ошибка произошла и определенные поля структуры не равны друг другу, то надо изменить одно из полей и вызвать АПИ снова.
Для решения этой задачи я хочу написать шаблон функции, который будет вызывать АПИ и принимать решение, вызывать ли АПИ второй раз. Но мне не понятно, как внутри такой функции проверить, произошла ли ошибка. Ведь параметры будут передаваться в функцию пачкой. Параметры у всех АПИ разные. Каким по счету будет идти параметр, сигнализирующий об ошибке, зависит от АПИ.
Правильно ли, что здесь решением может быть передача в такую функцию параметра, отвечающего за возврат ошибки, отдельным аргументом? Что-то типа такого:
struct ErrorCode { /* ... */ };
template <typename ApiFoo, typename... ApiArgs>
void CallApi(ErrorCode& ec, ApiFoo apiFoo, ApiArgs... apiArgs) {
apiFoo(apiArgs...);
if (!ec.IsError() || ec.Parm1 == ec.Parm2) return;
ec.Parm1 = ec.Parm2;
apiFoo(apiArgs...);
}
int main() {
ErrorCode ec;
CallApi(ec, SomeApi, 1, &ec, "hello");
}