Как мне объявить прототип C ++ с указателем void *, чтобы он мог принимать любой тип указателя? - PullRequest
1 голос
/ 25 сентября 2011

Я хочу создать прототип функции в C ++, чтобы был аргумент void *, который может принимать указатели любого типа. Я знаю, что это возможно в C. Это возможно в C ++?

[РЕДАКТИРОВАТЬ] Вот упрощенная версия кода, который я пытаюсь заставить работать:

#include <stdio.h>

void func(void (f)(const void *))
{
    int i = 3;
    (*f)(&i);
}

void func_i(const int *i)
{
    printf("i=%p\n",i);
}

void func_f(const float *f)
{
    printf("f=%p\n",f);
}

void bar()
{
    func(func_i);
}

А вот вывод компилятора:

$ g++ -c -Wall x.cpp
x.cpp: In function ‘void bar()’:
x.cpp:21: error: invalid conversion from ‘void (*)(const int*)’ to ‘void (*)(const void*)’
x.cpp:21: error:   initializing argument 1 of ‘void func(void (*)(const void*))’
$ %

Ответы [ 3 ]

4 голосов
/ 25 сентября 2011

Вы можете использовать void *, как и в C, но вам нужно будет приводить аргумент при вызове.Я предлагаю вам использовать функцию шаблона

template<typename T>
void doSomething(T* t) {...}
1 голос
/ 25 сентября 2011

Да.

int i = 345; void * ptr = &i; int k = *static_cast&lt int* &gt(ptr);

UPDATE ::
What you have shown in the code certainly cannot be done in C++.
Casting between void and any other must always be <b>explicitly</b> done.

Check these SO link for more details on what the C -standard has to say:
1) /139671/ukazatel-na-funktsiy-priveden-k-drugoi-podpisi
2) http://stackoverflow.com/questions/559581/casting-a-function-pointer-to-another-type
1 голос
/ 25 сентября 2011

Как насчет:

void func(void *);

точно так же, как в C?: P

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...