Указатели на функции 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);
Хотя я бы рекомендовал оставить "&" для удобства чтения
Вы не можете передать 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);