Указатели на функции C++/C, которые возвращают void*

Я пытаюсь вызвать функцию, которая принимает аргумент, void(*)(void*, int, const char*), но я не могу понять, как передать эти аргументы в функцию.

Пример:

void ptr(int);
int function(int, int, void(*)(int));

Я пытаюсь вызвать функцию следующим образом:

function(20, 20, ptr(20));

Это возможно?

6 ответов

Решение

Вы делаете одну вещь неправильно - вы пытаетесь вызвать вашу функцию 'ptr', прежде чем вызывать 'функцию'. То, что вы должны были сделать, это передать только указатель на "ptr" и вызвать "ptr", используя переданный указатель из "функции", вот так:

void ptr(int x)
{
    printf("from ptr [%d]\n", x);
}

int function(int a, int b , void (*func)(int) )
{
    printf( "from function a=[%d] b=[%d]\n", a, b );
    func(a); // you must invoke function here

    return 123;
}


void main()
{
    function( 10, 2, &ptr );
    // or
    function( 20, 2, ptr );
}

который дает:

from function a=[10] b=[2]
from ptr [10]
from function a=[20] b=[2]
from ptr [20]

что ты и хотел

за

function(20, 20, ptr(20));

чтобы работать - вы должны иметь что-то вроде:

// 'ptr' must return sth (int for example)
// if you want its ret val to be passed as arg to 'function'
// this way you do not have to invoke 'ptr' from within 'function'
int ptr(int);
int function(int, int , int);

Обычный трюк заключается в использовании typedef для подписи:

 typedef void signature_t (void*, int, const char*);

Обратите внимание, что без typedef синтаксис похож на объявление функции. Заявляет signature_t как typedef для функций, так что вы всегда будете использовать указатели на signature_t на практике.

Тогда вы можете объявить свою функцию "высокого порядка" как

 int function (int, int, signature_t*);

Смотрите также этот ответ.

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

function(20, 20, ptr(20));

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

function(20, 20, &ptr); 

or

function(20, 20, ptr); 

Хотя я бы рекомендовал оставить "&" для удобства чтения

Правильный синтаксис для вызова функции:

function(20,20, &ptr);

Если вы чувствуете себя потерянным, попробуйте несколько уроков, или это

Вы не можете передать ptr(20) этой функции, потому что вы можете только передать указатель на функцию, но не указатель с аргументом. Вы можете прочитать о функторах, и они помогут вам с такой проблемой. Или другое решение состоит в том, чтобы изменить подпись на

int function(int, int, void(*)(void) );

И написать функцию

void ptr_wrap(void) {ptr(20);}

так что вы можете позвонить function(20, 20, ptr_wrap);, Но функторы могут решить эту проблему более элегантным способом.

ptr(20) это возвращаемое значение ptrкогда вы проходите 20 к этому. Если вы хотите передать функцию (а не ее возвращаемое значение), вы должны написать просто function(20,20,ptr);

Другие вопросы по тегам