Compartilhar via


Como: Fornecer funções de trabalho para as classes de chamada e transformador

Este tópico ilustra várias maneiras para fornecer funções de trabalho para as classes de concurrency::call e de concurrency::transformer .

O primeiro exemplo mostra como passar um expressão lambda para um objeto de call .O segundo exemplo mostra como passar um objeto da função a um objeto de call .O terceiro exemplo mostra como associar um método da classe a um objeto de call .

Para a ilustração, cada exemplo neste tópico usa a classe de call .Para um exemplo que use a classe transformer. consulte Como: Use o transformador em um canal de dados.

Exemplo

O exemplo a seguir mostra uma maneira comum de usar a classe de call .Este exemplo passa uma função lambda para o construtor de call .

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

O exemplo produz a seguinte saída.

  

O exemplo a seguir é semelhante ao exemplo anterior, exceto que usa a classe de call juntamente com um objeto de função (functor).

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

O exemplo a seguir é semelhante ao exemplo anterior, exceto que usa funções de std::bind1st e de std::mem_fun para associar um objeto de call para um método da classe.

Use essa técnica se você precisa associar um objeto de call ou de transformer para um método de classe específico em vez do operador de chamada de função, 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;
}

Você também pode atribuir o resultado da função de bind1st a um objeto de std::function ou usar a palavra-chave de auto , conforme mostrado no exemplo o seguir.

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

Compilando o código

Copie o código de exemplo e cole-o em um projeto do Visual Studio, ou cole em um arquivo denominado call.cpp e execute o seguinte comando em uma janela de prompt de comando do Visual Studio.

cl.exe /EHsc call.cpp

Consulte também

Tarefas

Como: Use o transformador em um canal de dados

Referência

chame a classe

classe transformador

Conceitos

Biblioteca de agentes assíncrono

Blocos assíncronas de mensagem