1

Est-il possible d'utiliser la fonction boost::fusion::invoke pour appeler une fonction qui a des arguments par défaut sans les spécifier?Boost.Fusion Functional: Appeler des fonctions avec des arguments par défaut

Example: 

void foo(int x, int y = 1, int z = 2) 
{ 
    std::cout << "The sum is: " << (x + y + z) << std::endl; 
} 

... 

// This should call foo(0). It doesn't work because the type of foo is void (*) (int, int, int). 
boost::fusion::invoke(foo, boost::fusion::vector<int>(0)); 

// Works 
boost::fusion::invoke(foo, boost::fusion::vector<int, int, int>(0, 1, 2)); 

Je vous écris une enveloppe pour les liaisons à un des arguments de langage de script et par défaut améliorerait grandement la sensation intuitive pour les utilisateurs de l'emballage. Je crains cependant que la norme n'ait pas couvert ce cas.

Une note de côté:
Je sais que l'on pourrait travailler autour d'elle en utilisant foncteurs:

struct foo { 
    void operator() (int x, int y = 1, int z = 2) { /* ... */ } 
}; 

// Works because the functor adds an indirection 
boost::fusion::invoke(foo(), boost::fusion::vector<int>(0)); 

C'est cependant pas une option que je ne veux pas forcer les utilisateurs à créer foncteurs juste spécifiez les arguments par défaut.

Répondre

1

Vous pouvez utiliser bind (more info):

boost::fusion::invoke(boost::bind(foo, _1, 1, 2), boost::fusion::vector<int>(0)); 
+0

Merci, qui semble être une solution raisonnable. J'étais plus intéressé à spécifier les arguments par défaut directement dans la déclaration de la fonction, mais il semble qu'il est simplement impossible de combiner ceux avec invoke(). –

Questions connexes