共用方式為


Microsoft 資訊保護 SDK - 原則 SDK 觀察者

原則 SDK 包含一個觀察者類別。 觀察者成員是虛擬的,應該覆寫以處理非同步作業的回呼。

非同步作業完成時, OnXxx() 會呼叫對應至結果的成員函式。 範例包括 OnLoadSuccess()OnLoadFailure()OnAddEngineSuccess()mip::Profile::Observer

下列範例示範 SDK 範例也會使用 promise/future 模式,並可擴充以實作所需的回呼行為。

設定檔觀察者實作

在下列範例中,我們已建立衍生自 mip::Profile::Observer 的類別 ProfileObserver 。 已覆寫成員函式,以在整個範例中使用未來/承諾模式。

注意 :下列範例只會部分實作,且不包含相關觀察者覆 mip::ProfileEngine 寫。

profile_observer.h

在 標頭中,我們會定義 ProfileObserver 衍生自 mip::Profile::Observer ,然後覆寫每個成員函式。

class ProfileObserver final : public mip::Profile::Observer {
public:
ProfileObserver() { }
  void OnLoadSuccess(const std::shared_ptr<mip::Profile>& 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

在實作本身中,我們會定義要針對每個觀察者成員函式採取的動作。

每個成員都接受兩個參數。 第一個是函式所處理類別的共用指標。 ProfileObserver::OnLoadSuccess 預期會收到 mip::ProfileProfileObserver::OnAddEngineSuccess 預期會是 mip::ProfileEngine

第二個是內容的 共用指標 。 在我們的實作中,內容是 傳遞為 shared_ptr<void> 的 參考 std::promise 。 函式的第一行會將這個 std::promise 轉換成 ,然後儲存在名為 promise 的物件中。

最後,藉由設定 promise->set_value() 和 傳入 mip::Profile 物件,即可備妥未來。

#include "profile_observer.h"
#include <future>

//Called when Profile is successfully loaded
void ProfileObserver::OnLoadSuccess(const std::shared_ptr<mip::Profile>& profile, const std::shared_ptr<void>& context) {
  //cast context to promise
  auto promise = std::static_pointer_cast<std::promise<std::shared_ptr<mip::Profile>>>(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::Profile>>>(context);
  promise->set_exception(error);
}

//TODO: Implement remaining observer members

執行任何非同步作業時,觀察者實作會傳遞至設定建構函式或非同步函式本身。