имя функции в качестве параметра в c ++ - PullRequest
0 голосов
/ 17 апреля 2020

Допустим, у меня есть функция:

double fun (int *a, int b)
{
//sth
}

, и у меня была другая функция fun2, в которую я хотел бы передать вышеуказанную функцию следующим образом:

fun2(fun);

Как определить fun2 и как использовать функцию, переданную в качестве параметра внутри него?

Ответы [ 3 ]

3 голосов
/ 17 апреля 2020

Что ж, самый простой способ - это использовать шаблон (который выведет тип для вас, не копаясь в указателе функции и компании):

template<class Funct>
double fun2(Funct my_funct){
    my_funct( /*parameters of the function, or at least something that can be casted to the required types of the function parameters*/ );
}

В плохом слове, вы «передаете» указатель функции, которая может использоваться как функция, и, таким образом, используя operator(), вы вызываете ее.

Это скомпилирует все, что определено operator()(/*parameters of my_funct*/), и объекты с этим оператором (например, check * 1008). *) или вызываемые функции и лямбды.

2 голосов
/ 17 апреля 2020

Старомодный способ (указатель на функцию):

void fun2(double (*fun)(int*, int));

C ++ 11 и далее:

#include <functional>
void fun2(std::function<double(int*, int)> fun);
0 голосов
/ 17 апреля 2020

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

using callback = double( * )( int* a, int b );

void fun2( callback cb )
{
    // Invoke directly.
    auto ret{ cb( nullptr, 0 ) }; 

    // Or with 'invoke'.
    ret{ std::invoke( cb, nullptr, 0 ) };
}

Вызов fun2:

fun2( [ ]( auto ptr, auto value ) { return 1.0; } );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...