2015-11-06 5 views
0

Я пытаюсь написать функцию (мы будем называть ее функцией A), которая может принимать определяемую пользователем функцию как вход (например, пользовательская функция, которая принимает любое число переменных и возвращает целое число. Назовем эту функцию B). Я хочу передать функцию B в качестве параметра для функции A, только модифицировать некоторые из переменных в функции B и вызывать функцию B столько раз, сколько мне нужно из функции A.C++ передаёт определенную пользователем функцию другой функции

Я думал, что смогу это сделать работайте, производя переменные указателей функции B и изменяя указатели при каждом вызове, однако я не знаю, как это сделать, поэтому я могу вызывать функцию B из функции A, если число переменных, передаваемых функции B, неизвестно ,

Есть ли у кого-нибудь какие-либо предложения относительно того, как я могу передать указанную пользователем функцию в качестве параметра другой функции?

+0

Короткий ответ: вы не можете. Когда вы вызываете B, вы должны передать * some * количество параметров. Изменение этого требует изменения исходного кода, что означает повторную компиляцию. Если вам действительно нужно переменное количество параметров, вам, вероятно, нужно написать B, чтобы принять что-то вроде вектора параметров. Если типы могут меняться, это может быть что-то вроде 'std :: vector '. –

ответ

1

Что вы хотите, это указатель на функцию.

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

#include <iostream> 
double B(int x) // sample function that we call 
{ 
     return x*42.0; 
} 

void A(double (*f)(int)) 
{ 
    for (int i = 0; i < 25; ++i) 
     std::cout << f(i) << '\n'; 
} 

int main() 
{ 
    A(B); 
} 

Если вы хотите передать функцию, которая принимает список переменных аргументов, измените приведенное выше. Посмотрите на формирование на стандартном заголовке <cstdarg> для указателей о том, как это сделать.

Существуют также методы, включающие шаблоны (в частности, шаблонные функторы) и lambdas (в C++ 11 и более поздних версиях). Но с помощью указателя на функцию достаточно, чтобы вы начали.

0

Поскольку вы упомянули, что вы можете изменять переменные в функции B, указатель на функцию не является хорошим выбором, особенно когда C++ вводит вызываемый объект или std::function. Построив класс с оператором (), вы можете обрабатывать объект такого класса как объект и как указатель функции.

Другая альтернатива лямбда представлена ​​на C++ 11. Вы можете просто написать [A_variable_1, A_variable_2](auto parameter){ your code}, чтобы использовать переменную в A и свою собственную переменную в B.

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