2 votes

std::bind et std::function term ne s'évalue pas comme prenant 0 argument ?

Je travaille sur une classe générique qui sera utilisée pour exécuter des fonctions de différents prototypes pour tester la performance des algorithmes.

Je suis resté bloqué parce que std::function ne peut pas exécuter ce avec quoi il a été lié, voici un exemple de code, avec un commentaire à l'endroit où l'erreur se produit :

#include <utility>
#include <functional>

template<typename ReturnType>
class Performance
{
public:
    template<typename... Args>
    using Algorithm = std::function<ReturnType(Args...)>;

    template<typename... Params>
    void run(const Algorithm<Params...>& ref, const Algorithm<Params...>& target)
    {
        // ERROR: term does not evaluate as taking 0 args
        ref();
        target();
    }
};

void bar1(int, int)
{
    // algorithm 1
}

void bar2(int, int)
{
    // algorithm 2
}

int main()
{
    using test = Performance<void>;
    using Algorithm = test::Algorithm<int, int>;

    int x = 0;
    int y = 1;

    Algorithm ref = std::bind(bar1, std::ref(x), std::ref(y));
    Algorithm target = std::bind(bar2, std::ref(x), std::ref(y));

    test foobar;

    foobar.run(ref, target);
}

4voto

songyuanyao Points 2265

Le problème, c'est que la std::function c'est-à-dire Algorithm est déclaré comme prenant deux paramètres (de type int ) ; lors de l'appel à ces derniers, deux arguments sont nécessaires.

Après std::bind appliqués, les foncteurs retournés ne prennent pas de paramètres ; les arguments ( std::ref(x) y std::ref(y) ) ont été liés. Algorithm doit être déclarée comme

using Algorithm = test::Algorithm<>;

VIVRE

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X