Supposons que j'ai une fonction qui prend un foncteur arité comme argument:Perform substitution des arguments sur la poussée imbriqué :: bind sans composition
void enqueue(boost::function<void()> & functor);
J'ai une autre fonction qui prend un entier et fait quelque chose en interne:
void foo(int a);
Je voudrais nid, mais pas composer, ceux-ci ensemble pour que je sois un foncteur avec la signature:
boost::function<void(int)> functor
qui, lorsqu'il est appelé avec une valeur - dire 4 - effectue les opérations suivantes:
enqueue(boost::bind(&foo, 4))
Ma première tentative a été la suivante:
boost::function<void(int)> functor = boost::bind(&enqueue, boost::bind(&foo,_1))
Cela échoue parce que bind exécute la composition lorsqu'elle est administrée une liaison imbriquée. foo a d'abord été appelé, puis la valeur void a été "retournée" à enqueue, ce qui échoue.
Ma deuxième tentative a été la suivante:
boost::function<void(int)> functor = boost::bind(&enqueue, boost::protect(boost::bind(&foo, _1)))
Cela a échoué car enqueue accepte un foncteur arité, non unaire.
Est-ce que ce que je cherche peut être fait?
Autres informations:
- Ceci est essentiellement identique à la question sans réponse du forum coup de pouce il y a 6 ans: http://lists.boost.org/boost-users/2004/07/7125.php
- Un peu de lecture suggère que l'utilisation de boost :: lambda :: bind avec boost :: lambda :: unlambda et boost :: lambda :: protect peut faire ce que je cherche. Malheureusement, boost :: lambda a un nombre inacceptable d'espaces réservés autorisés (3), et un temps de compilation élevé.
en plus de l'emboîtement manuel suggéré ci-dessous, cela devrait d travail: –