Le code suivant ne compile pas .. mais existe un moyen d'obtenir un pointeur de fonction pour renvoyer un autre pointeur de fonction équivalent à lui-même?
4 Réponses :
Réponse courte: Non, vous ne pouvez pas le faire directement. Vous pouvez vous rapprocher d'utiliser des pointeurs de vide, mais il est non standard en tant que pointeur vide n'est pas garanti d'être suffisamment grand pour adapter un pointeur de fonction. Voir gourou de la semaine # 57 pour plus de détails.
L'approche compatible des normes la plus proche est de définir une enveloppe Tapez pour le pointeur de fonction: p> Vous pouvez maintenant écrire: p>
Ce n'est pas possible à cause de la vérification de type. Il faudrait que les compilateurs résolvent des points fixes dans leur vérification de type et que les compilateurs ne puissent actuellement le faire.
La plus proche de ce que vous pouvez faire est abstraite à l'écart du type de retour via Héritage: P>
template<class T>
class Function { public: virtual void Map(T t)=0; };
template<class T, class K>
class FunctionPtr : public Function<T> {
public:
FunctionPtr(K (*fptr)(T)) : fptr(fptr) { }
void Map(T t) { fptr(t); }
private:
K (*fptr)(T);
};
Function<int> *my_function(int i)
{
return new FunctionPtr<int,Function<int>*>(&my_function);
}
C'était le plus proche que je suis arrivé dans environ 15 minutes ...: maintenant pour que ce bébé générique pour n paramètre est laissé comme un exercice au lecteur :) p> p>
Il y a quelques solutions Clever C ++ ici, mais la solution Pure C que j'ai toujours vue est de simplement utiliser un petit casting: la norme nécessite qu'un pointeur de fonction qui soit lancé à un autre type de pointeur de fonction et arrière em> est égal au pointeur de fonction d'origine, ce qui rend ce code complètement fiable. p> p>
gotw.ca/gotw/057.htm
Newty.de/fpt/fpt.html - Section 2.7 - Google est votre ami.