共用方式為


如何:為呼叫和轉換程式類別提供工作函式

本主題說明許多將工作函式提供給 concurrency::callconcurrency::transformer 類別的方式。

第一個範例示範如何將 Lambda 運算式傳遞給 call 物件。 第二個範例示範如何將函式物件傳遞給 call 物件。 第三個範例示範如何將類別方法繫結至 call 物件。

為了說明方便,本主題中的每個範例都會使用 call 類別。 如需使用 transformer 類別的範例,請參閱 如何:在資料管線中使用轉換程式

範例

下列範例示範使用 call 類別的常見方式。 這個範例會將 Lambda 函式傳遞給 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;
}

這個範例產生下列輸出。

  

下列範例與上一則範例很相似,不過它會使用 call 類別搭配函式物件 (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;
}

下列範例與上一則範例很相似,不過它會使用 std::bind1ststd::mem_fun 函式,將 call 物件繫結至類別方法。

如果您必須將 calltransformer 物件繫結至特定類別方法而非函式呼叫運算子 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;
}

您也可以將 bind1st 函式的結果指派給 std::function 物件或使用 auto 關鍵字,如下列範例所示。

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

編譯程式碼

請複製範例程式碼,並將它貼在 Visual Studio 專案中,或貼在名為 call.cpp 的檔案中,然後在 Visual Studio 的 [命令提示字元] 視窗中執行下列命令。

cl.exe /EHsc call.cpp

請參閱

工作

如何:在資料管線中使用轉換程式

參考

call 類別

transformer 類別

概念

非同步代理程式程式庫

非同步訊息區