2012-03-24 2 views
0

Я думаю, что некоторые более новые языки, такие как JS, могут сделать это изначально, но я забыл термин для него (сделайте «временную» функцию в строке, чтобы просто пройти как обратный вызов)Код в качестве параметра функции вместо объявления обратного вызова

То, что я хочу сделать, это ...

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

Это работает отлично, и я мог оставить его & двигаться дальше, но ... Я просто любопытно ...

иногда функция является излишеством, и мне просто нужно один сравнение; когда-нибудь будет делать небольшой блок кода. Возможно, я мог бы просто оценить их до нулевого/ненулевого значения во время выполнения? Но как пройти в качестве параметра?

На данный момент моя функция имеет следующую подпись

void AddExpectedCommand(E_peripheralType peripheral, 
         communicationBlock_t commandBlock, 
         errorMessage_t errorMessage, 
         void *(*DoRunTimeChecks)(E_boolean)); 

, где последний параметр является указателем на функцию обратного вызова, возвращающей логическое значение.

Есть ли способ, которым я мог бы передать выражение кода как параметр?

Или функция кажется «более чистой»?

Заранее спасибо за любую помощь ...


Update: упс, я получил мое заявление неправильно. Я хочу передать указатель так, что функция, которая не имеет параметров и возвращает e_Boolean ... как это сделать?

+0

Последний параметр является указателем на функцию обратного вызова возвращает указатель типа 'void'. Указателем на функцию обратного вызова, возвращающим логическое значение, будет 'E_boolean (* DoRunTimeChecks) (E_boolean)'. –

ответ

2

С C++ 11 вы можете сделать следующее:

Функция принимает функцию, которая возвращает логическое значение:

void f(function<bool()>); 

Называйте это с лямбда-захватывая локальную переменную:

int x = ...; 

f([&x]() { return (x > 2); }); 

Или назовите его некоторой функцией g, которая возвращает bool:

bool g(); 


f(g); 

Или связать некоторую функцию Н, которая принимает Int и возвращает логическое значение:

bool h(int x); 


f(bind(h, 2)); // ie creates a nullary function from h(2) 
2

То, что вы ищете, называется «лямбда-выражением» или «анонимной функцией». И они не существуют в C (но делают на C++ с определенной квалификацией).

Смежные вопросы