Policy SDK には、1 つのオブザーバー クラスが含まれています。 非同期操作のコールバックを処理するには、仮想オブザーバー メンバーをオーバーライドします。
非同期操作が完了すると、SDK は結果に対応する OnXxx() メンバー関数を呼び出します。
OnLoadSuccess() の例としては、OnLoadFailure()、OnAddEngineSuccess()、mip::PolicyProfile::Observer があります。
次の例は、promise/future パターンを示しています。 SDK サンプルでもこのパターンが使用され、目的のコールバック動作を実装するように拡張できます。
プロファイル オブザーバーの実装
次の例では、mip::PolicyProfile::Observerから派生するクラス (ProfileObserver) を作成します。 メンバー関数は、サンプル全体で使用される future/promise パターンを使用するように基底クラスをオーバーライドします。
Note
次のサンプルでは、オブザーバー クラスの一部のみを実装し、 mip::PolicyEngine 関連するオブザーバーのオーバーライドは含まれません。
profile_observer.h
ヘッダーは ProfileObserverを定義し、 mip::PolicyProfile::Observerから派生した後、各メンバー関数をオーバーライドします。
class ProfileObserver final : public mip::PolicyProfile::Observer {
public:
ProfileObserver() { }
void OnLoadSuccess(const std::shared_ptr<mip::PolicyProfile>& profile, const std::shared_ptr<void>& context) override;
void OnLoadFailure(const std::exception_ptr& error, const std::shared_ptr<void>& context) override;
//TODO: Implement remaining members
};
profile_observer.cpp
実装では、各オブザーバー メンバー関数に対して実行するアクションを定義します。
各メンバーは、2 つのパラメーターを受け取ります。 1 つ目は、関数が処理するクラスへの共有ポインターです。
ProfileObserver::OnLoadSuccess は mip::PolicyProfile を受け取ることを想定しています。
ProfileObserver::OnAddEngineSuccess は mip::PolicyEngineを想定しています。
2 つ目は、 コンテキストへの共有ポインターです。 この実装では、コンテキストは std::promiseへの参照であり、 shared_ptr<void>として渡されます。 関数の最初の行は、この値を std::promiseにキャストし、 promiseというオブジェクトに格納します。
最後に、 promise->set_value() を設定し、 mip::PolicyProfile オブジェクトを渡すことで、将来の準備が整います。
#include "profile_observer.h"
#include <future>
//Called when Profile is successfully loaded
void ProfileObserver::OnLoadSuccess(const std::shared_ptr<mip::PolicyProfile>& profile, const std::shared_ptr<void>& context) {
//cast context to promise
auto promise = std::static_pointer_cast<std::promise<std::shared_ptr<mip::PolicyProfile>>>(context);
//set promise value to profile
promise->set_value(profile);
}
//Called when Profile fails to load
void ProfileObserver::OnLoadFailure(const std::exception_ptr& error, const std::shared_ptr<void>& context) {
auto promise = std::static_pointer_cast<std::promise<std::shared_ptr<mip::PolicyProfile>>>(context);
promise->set_exception(error);
}
//TODO: Implement remaining observer members
非同期操作を実行する場合は、オブザーバーの実装を設定コンストラクターまたは非同期関数自体に渡します。
次のステップ
- GitHubの MIP Policy SDK C++ サンプルを確認します。