Salut !

Je continue à jouer avec des API en C utilisant des void* pour les wrapper dans des classes C++.

Aujourd'hui, j'ai une fonction C qui attend en paramètre un pointeur sur une fonction prenant un void* en paramètre et ne retournant rien. Je crée un wrapper en C++ dans lequel j'arrive à m'assurer que ce void* sera en fait l'adresse d'un objet. Je souhaite donc écrire un code comme ceci :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// -----------------------
// C world
using C_callback = void(*)(void*);
 
void registerCallback(C_callback c) {
	(void) c;
}
 
// -----------------------
// C++ world
class Foo {
public:
	using Cpp_callback = void(*)(Foo*);
 
	Foo(Cpp_callback cpp) {
		registerCallback(reinterpret_cast<C_callback>(cpp));
	}
};
Sans reinterpret_cast<>, j'ai l'erreur suivante, qui me parait tout à fait logique : error: invalid conversion from 'void (*)(Foo*)' to 'void (*)(void*)' [-fpermissive]. Le compilateur ne peut pas du tout assurer que ce void* sera en fait un Foo*. Si je peux le garantir (de part la construction de mon programme), est-ce qu'un tel cast est OK ?

Question bonus : que fait la 2e ligne par rapport à la première ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
using C_callback = void(*)(void*);
using what_is_it= void(void*);