2017-03-19 5 views
3

私はこのslidesをチェックし、まだ取得していない:なぜQuantLibはHandleクラスを導入しましたか?

1) what problem does Handle sovled? 

2) what is the benefit to add the Handle class? 

そのソースコードから、私はどちらか任意の手掛かりを得ることができません。

template <class Type> 
    class Handle { 
     protected: 
     class Link : public Observable, public Observer { 
      public: 
      explicit Link(const shared_ptr<Type>& h = 
             shared_ptr<Type>()); 
      void linkTo(const shared_ptr<Type>&); 
      bool empty() const; 
      void update() { notifyObservers(); } 
      private: 
      shared_ptr<Type> h_; 
     }; 
     boost::shared_ptr<Link<Type> > link_; 
     public: 
     explicit Handle(const shared_ptr<Type>& h = 
             shared_ptr<Type>()); 
     const shared_ptr<Type>& operator->() const; 
     const shared_ptr<Type>& operator*() const; 
     bool empty() const; 
     operator boost::shared_ptr<Observable>() const; 
    }; 

    template <class Type> 
    class RelinkableHandle : public Handle<Type> { 
     public: 
     explicit RelinkableHandle(const shared_ptr<Type>& h = 
             shared_ptr<Type>()); 
     void linkTo(const boost::shared_ptr<Type>&); 
    }; 

は、誰かがより良い例を挙げてもらえますか?

ありがとうございました。

答えて

3

短い答え:Handleクラスは、ポインタへのスマートポインタです。

何が良いですか?例えば、Euribor6Mのような金利インデックスのインスタンスを取る。現在、そのコンストラクタは、将来の固定を予測するyield term構造のハンドルを取ります。代わりにshared_ptrを使用した場合、何が変更されますか?

はのは、ユースケースを見てみましょう。警告:あまりにも多くのコードを書くことを避けるために単純化していますが、これは正当な使用例です。我々はそもそも平らな曲線とインデックスを初期化するとしましょう:

shared_ptr<SimpleQuote> r = make_shared<SimpleQuote>(0.01); 
shared_ptr<YieldTermStructure> curve = 
    make_shared<FlatForward>(today, r, Actual360()); 

shared_ptr<InterestRateIndex> index = make_shared<Euribor6M>(curve); 

(実際のユースケースには、curveが引用されたレートのセットを介してブートストラップEURIBOR曲線になります)。 indexのコンストラクタは、渡されたshared_ptr<YieldTermStructure>のコピーをとり、それをコピーしてデータメンバとして格納します。それが構築された後、我々は他の楽器(スワップ、変動金利の債券など)にインデックスを渡します。

金利が変更され、rcurveが共有ポインタなので、我々はまだr引用のホールドを持っている与えられた、私たちのクライアントコードが

r->setValue(0.015); 

を書くことができ、これもでレートを変更します場合はインデックス内のカーブのコピー(curveとそのコピーはindexの両方が同じオブジェクトを指しているため)。その結果、インデックスの固定値と依存する計測値も変化します。

しかし、我々は別の曲線を使用して開始したいとしましょう。この場合、我々は代わりにフラット1の補間曲線への切り替えが必要になる場合があります実際のケースでは(

vector<Date> dates = ... ; 
vector<Rate> rates = ... ; 
shared_ptr<YieldTermStructure> curve2 = 
    make_shared<ZeroCurve>(dates, rates, Actual360()); 

、我々は引用符の異なるセットに曲線をブートストラップするか、別の方法を使用する場合がありますモデルレートに)。

どのように我々はそれがcurve2を使用して起動する必要があることindexを伝えることができますか? shared_ptrを使用することはできません。私たちが言う場合でも:

curve = curve2; 

これはindexcurveの補間曲線を指すようにcurveが、コピーの原因になります古いものを指し続けます。これはshared_ptrの問題ではありませんが、一般的なポインターが付いています。どうやってそれを解決するのですか?インダイレクションの別のレイヤーを追加します。生のポインタを使用していた場合は、ポインタへのポインタの使用を開始します。私たちのコードではHandleは同じことをしています:shared_ptrを指しており、同じハンドルの2つのコピーが同じshared_ptrを指すように実装されています。あなたが書く場合は、この方法では、:あなたは後で書くことができます

shared_ptr<SimpleQuote> r = make_shared<SimpleQuote>(0.01); 
shared_ptr<YieldTermStructure> curve = 
    make_shared<FlatForward>(today, r, Actual360()); 
RelinkableHandle<YieldTermStructure> h(curve); 

shared_ptr<InterestRateIndex> index = make_shared<Euribor6M>(h); 

index内部

h.linkTo(curve2); 

、あなたが保持ハンドルとそのコピーの両方が新しい曲線を指します。

RelinkableHandleHandleの違いは、前者の場合はlinkToにしかコールできません。考え方は、RelinkableHandleをインスタンス化し、コピーをちょうどHandleとして渡すので、誰もあなたが指しているものを変更することができないようにします(constを使用すると、単純なコピーでconstをキャストすることができません)。

+0

ご清聴ありがとうございます、ルイージ! – camino

+0

ご清聴ありがとうございます。これに関するもう1つの質問。クラスリンクは何をし、リンクのコンストラクタに渡された共有ポインタhについてどう考えるべきですか? – user1559897

+0

リンク内の 'shared_ptr'は、現在ポイントされているオブジェクトです。 'Link'クラスはそれの上にオブザーバビリティを追加して、先のオブジェクトが変わったときに通知を受け取ります。 –

関連する問題