HOW TO:為呼叫和轉換程式類別提供工作函式
本主題說明許多將工作函式提供給 Concurrency::call 和 Concurrency::transformer 類別的方式。
第一個範例示範如何將 Lambda 運算式傳遞給 call 物件。 第二個範例示範如何將函式物件傳遞給 call 物件。 第三個範例示範如何將類別方法繫結至 call 物件。
為了說明方便,本主題中的每個範例都會使用 call 類別。 如需使用 transformer 類別的範例,請參閱 HOW TO:在資料管線中使用轉換程式。
範例
下列範例示範使用 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;
}
這個範例會產生下列輸出。
13 squared is 169.
下列範例與上一則範例很相似,不過它會使用 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::bind1st 和 std::mem_fun 函式,將 call 物件繫結至類別方法。
如果您必須將 call 或 transformer 物件繫結至特定類別方法而非函式呼叫運算子 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 2010 的 [命令提示字元] 視窗中執行下列命令。
cl.exe /EHsc call.cpp