0
votes

Puis-je créer des pointeurs de fonction génériques en C ++?

J'ai les méthodes suivantes:

Matrix& relu(float threshold, Matrix& M)
Matrix& softmax(Matrix& M)


3 commentaires

Cela ressemble à un problème xy. Qu'essayez-vous de résoudre? Nous pouvons probablement vous donner une meilleure solution.


Comment appeleriez-vous la nouvelle fonction avec différents paramètres?


Une union de deux pointeurs de fonction suffit-il? De toute évidence, vous seriez capable d'utiliser un seul d'entre eux à la fois.


3 Réponses :


0
votes

Techniquement, vous pouvez indiquer les deux fonctions avec n'importe quel pointeur de fonction. Vous aurez juste besoin de convertir le type explicitement. Bien sûr, vous ne pourrez pas appeler à travers le pointeur si le type ne correspond pas.

Une autre option consiste à stocker le pointeur de la fonction dans un type d'emballage d'effacement tel que std :: n'importe quel ou std :: variante , qui fournit un mécanicien de visite qui peut être utile.

Donc, vous avez des moyens de pointer vers les différentes fonctions, mais une autre question est de savoir si cela est de quelque sorte utile.


2 commentaires

@eroika Vous n'avez pas besoin d'utiliser void * . Vous pouvez simplement choisir un pointeur de fonction, car tout pointeur à fonction peut être jeté sur un pointeur sur n'importe quel autre type de fonction et peut être utilisé après la mise en place du type de pointeur de fonction d'origine.


@Raymondchen Point intéressant, n'a pas pensé à cela. J'ai simplifié la réponse.



-1
votes

Vous pouvez utiliser une fiche générique wrapper std :: Fonction < / code> : xxx


Votre fonction d'activation relu et softmax devrait probablement accepter une référence à un const Vector et retourne un nouveau vecteur de valeur.


2 commentaires

J'aurais utilisé BID au lieu d'envelopper la fonction relu. (Plus précisément, BIND_FRONT est beaucoup plus clair).


@ M.WORSHIPME C ++ 11 Lambdas sont plus efficaces que Bind . Il y a peu de raisons d'utiliser lid en C ++ 11 et aucune raison du tout en C ++ 14.



0
votes

Il y a une solution de temps d'exécution, qui serait un peu plus lente et où vous devriez vérifier quel type il est xxx


et il y a aussi une version de la compilation, Ce qui est plus rapide et plus sûr d'utiliser, car il ne manquera pas au moment de l'exécution, mais générer une erreur de compilateur, mais est un peu plus inflexible pour votre code: xxx


0 commentaires