Partager via


Comment : fournir des fonctions de travail aux classes call et transformer

Cette rubrique illustre plusieurs façons de fournir des fonctions de travail aux classes concurrency ::call et concurrency ::transformer .

Le premier exemple montre comment passer une expression lambda à un call objet. Le deuxième exemple montre comment passer un objet de fonction à un call objet. Le troisième exemple montre comment lier une méthode de classe à un call objet.

Pour illustration, chaque exemple de cette rubrique utilise la call classe. Pour obtenir un exemple qui utilise la transformer classe, consultez Guide pratique pour utiliser un transformateur dans un pipeline de données.

Exemple : appeler une classe

L’exemple suivant montre un moyen courant d’utiliser la call classe. Cet exemple transmet une fonction lambda au call constructeur.

// call-lambda.cpp
// compile with: /EHsc
#include <agents.h>
#include <iostream>

using namespace concurrency;
using namespace std;

int wmain()
{
   // Stores the result of the computation.
   single_assignment<int> result;

   // Pass a lambda function to a call object that computes the square
   // of its input and then sends the result to the message buffer.
   call<int> c([&](int n) {
      send(result, n * n);
   });

   // Send a message to the call object and print the result.
   send(c, 13);
   wcout << L"13 squared is " << receive(result) << L'.' << endl;
}

Cet exemple produit la sortie suivante.

13 squared is 169.

Exemple : appeler une classe avec un objet de fonction

L’exemple suivant ressemble à celui précédent, sauf qu’il utilise la call classe avec un objet de fonction (fonctor).

// call-functor.cpp
// compile with: /EHsc
#include <agents.h>
#include <iostream>

using namespace concurrency;
using namespace std;

// Functor class that computes the square of its input.
class square
{
public:
   explicit square(ITarget<int>& target)
      : _target(target)
   {
   }

   // Function call operator for the functor class.
   void operator()(int n)
   {
      send(_target, n * n);
   }

private:
   ITarget<int>& _target;
};

int wmain()
{
   // Stores the result of the computation.
   single_assignment<int> result;

   // Pass a function object to the call constructor.
   square s(result);
   call<int> c(s);

   // Send a message to the call object and print the result.
   send(c, 13);
   wcout << L"13 squared is " << receive(result) << L'.' << endl;
}

Exemple : Fonctions pour lier un objet d’appel

L’exemple suivant ressemble à celui précédent, sauf qu’il utilise les fonctions std ::bind1st et std ::mem_fun pour lier un call objet à une méthode de classe.

Utilisez cette technique si vous devez lier un call ou transformer un objet à une méthode de classe spécifique au lieu de l’opérateur d’appel de fonction. operator()

// call-method.cpp
// compile with: /EHsc
#include <agents.h>
#include <functional>
#include <iostream>

using namespace concurrency;
using namespace std;

// Class that computes the square of its input.
class square
{
public:
   explicit square(ITarget<int>& target)
      : _target(target)
   {
   }

   // Method that computes the square of its input.
   void square_value(int n)
   {
      send(_target, n * n);
   }

private:
   ITarget<int>& _target;
};

int wmain()
{
   // Stores the result of the computation.
   single_assignment<int> result;

   // Bind a class method to a call object.
   square s(result);
   call<int> c(bind1st(mem_fun(&square::square_value), &s));

   // Send a message to the call object and print the result.
   send(c, 13);
   wcout << L"13 squared is " << receive(result) << L'.' << endl;
}

Vous pouvez également affecter le résultat de la bind1st fonction à un objet std ::function ou utiliser la auto mot clé, comme illustré dans l’exemple suivant.

// Assign to a function object.
function<void(int)> f1 = bind1st(mem_fun(&square::square_value), &s);
call<int> c1(f1);

// Alternatively, use the auto keyword to have the compiler deduce the type.
auto f2 = bind1st(mem_fun(&square::square_value), &s);
call<int> c2(f2);

Compilation du code

Copiez l’exemple de code et collez-le dans un projet Visual Studio, ou collez-le dans un fichier nommé call.cpp , puis exécutez la commande suivante dans une fenêtre d’invite de commandes Visual Studio.

cl.exe /EHsc call.cpp

Voir aussi

Bibliothèque d’agents asynchrones
Blocs de messages asynchrones
Guide pratique pour utiliser la classe transformer dans un pipeline de données
call, classe
transformer, classe