Fonction de liaison C ++ à utiliser comme argument d’une autre fonction

J’ai une fonction qui nécessite un pointeur de fonction en argument:

int func(int a, int (*b)(int, int)) { return b(a,1); } 

Maintenant, je veux utiliser une certaine fonction qui a trois arguments dans cette fonction:

 int c(int, int, int) { // ... } 

Comment puis-je lier le premier argument de c pour pouvoir faire:

 int i = func(10, c_bound); 

J’ai regardé std::bind1st mais je n’arrive pas à comprendre. Il ne retourne pas un pointeur de fonction, non? J’ai toute liberté pour adapter les func sorte que tout changement d’approche soit possible. Bien que j’aimerais que l’utilisateur de mon code soit capable de définir son propre c

Notez que ce qui précède est une simplification féroce des fonctions réelles que j’utilise.

Le projet nécessite malheureusement C++98 .

Tu ne peux pas faire ça. Vous devrez modifier func pour prendre un object fonction en premier. Quelque chose comme:

 int func( int a, std::function< int(int, int) > b ) { return b( a, rand() ); } 

En fait, il n’est pas nécessaire que b soit une std::function , il pourrait être modélisé à la place:

 template< typename T > int func( int a, T b ) { return b( a, rand() ); } 

mais je restrais avec la version std::function pour plus de clarté et une sortie du compilateur un peu moins compliquée sur les erreurs.

Ensuite, vous pourrez faire quelque chose comme:

 int i = func( 10, std::bind( &c, _1, _2, some-value ) ); 

Notez que tout ceci est en C ++ 11 , mais vous pouvez le faire en C ++ 03 en utilisant Boost.

Eh bien, si vous savez au moment de la compilation, avec quoi vous devez lier c, vous pouvez définir une nouvelle fonction

 int c_bound(int a, int b) { return c(a,b,some_value); } 

Ce n’est évidemment pas une solution générique, mais pourrait résoudre votre problème actuel. Sinon, la solution de K-ballo semble être la seule solution générique simple. Cependant, cela nécessite que vous puissiez modifier la signature de func . Si vous avez vraiment une API que vous ne pouvez pas toucher à la signature et que vous devez toujours lier un argument ET si la solution ci-dessus ne résout pas votre cas spécifique: Solution basée sur LLVM pour comstackr une fonction au moment de l’exécution et transmettre son adresse dans de telles situations.

Vous ne pourriez pas utiliser une fonction à 3 arguments en tant que fonction à 2 arguments; Principalement parce qu’il n’y a pas de véritable moyen de déterminer ce que ferait le troisième paramètre.

Bien que la réponse ci-dessus fonctionne, voici une autre option:

Si l’un des parameters de c() , utilisé dans func , est constant, vous pouvez écrire une fonction d’emballage pour c(int, int, int) :

 int d(int a, int b) { return c(a, b, 0); //use a constant parameter } 

ou, si vous pouvez déterminer le 3ème paramètre à partir des deux parameters donnés, vous pouvez également essayer:

 int e(int a, int b) { int extra = 0; ///Determine extra from a, and b return c(a, b, c); }