Freigeben über


Gewusst wie: Bereitstellen von Arbeitsfunktionen für die call- und transformer-Klassen

In diesem Thema veranschaulicht einige Verwendungsmöglichkeiten für Arbeit Funktionen bieten die concurrency::call und concurrency::transformer Klassen.

Im ersten Beispiel wird gezeigt, wie ein Lambda-Ausdruck an ein call-Objekt übergeben wird.Im zweiten Beispiel wird gezeigt, wie ein Funktionsobjekt an ein call-Objekt übergeben wird.Im dritten Beispiel wird gezeigt, wie eine Klassenmethode an ein call-Objekt gebunden wird.

Zu Illustrationszwecken wird in allen Beispielen dieses Themas die call-Klasse verwendet.Ein Beispiel, in dem die transformer-Klasse verwendet wird, finden Sie unter Gewusst wie: Verwenden von transformer in einer Datenpipeline.

Beispiel

Im folgenden Beispiel wird aufgezeigt, wie die call-Klasse häufig verwendet wird.In diesem Beispiel wird eine Lambda-Funktion an den call-Konstruktor übergeben.

// 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;
}

Folgende Ergebnisse werden zurückgegeben:

13 squared is 169.

Das folgende Beispiel ähnelt dem vorherigen mit der Ausnahme, dass die call-Klasse zusammen mit einem Funktionsobjekt (Funktionselement) verwendet wird.

// 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;
}

Das folgende Beispiel ähnelt dem vorherigen Beispiel, mit dem Unterschied, dass die std::bind1st-Funktion und die std::mem_fun-Funktion zum Binden eines call-Objekts an eine Klassenmethode verwendet werden.

Verwenden Sie diese Technik anstatt des Funktionsaufrufoperators, operator(), wenn Sie ein call- oder transformer-Objekt an eine bestimmte Klassenmethode binden möchten.

// 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;
}

Sie können auch einem std::function-Objekt das Ergebnis der bind1st-Funktion zuweisen oder das auto-Schlüsselwort verwenden (siehe folgendes Beispiel).

// 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);

Kompilieren des Codes

Kopieren Sie den Beispielcode und fügen Sie ihn in ein Visual Studio Projekt, oder fügen Sie ihn in eine Datei mit dem Namen call.cpp und führen Sie den folgenden Befehl in ein Visual Studio-Eingabeaufforderungsfenster.

cl.exe /EHsc call.cpp

Siehe auch

Aufgaben

Gewusst wie: Verwenden von transformer in einer Datenpipeline

Referenz

call-Klasse

transformer-Klasse

Konzepte

Asynchronous Agents Library

Asynchrone Nachrichtenblöcke