我检查了这个slides,但仍然没有得到:
head(DF)
> Date
01.01.2014
02.01.2014
03.01.2014
01.02.2014
DF[,"Company"] <- companylist
从源代码中,我无法得到任何线索:
1) what problem does Handle sovled?
2) what is the benefit to add the Handle class?
有人可以提供更好的例子吗?
感谢。
答案 0 :(得分:7)
简短回答:Handle
类是指向指针的智能指针。
有什么好处?例如,采用诸如Euribor6M
之类的利率指数的实例。现在,它的构造函数处理一个收益期限结构,从中预测其未来的定价。如果我们使用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>
的副本,并将其副本存储为数据成员。在它建成之后,我们会将指数传递给其他工具(掉期,浮动利率债券等)。
如果利率发生变化,并且我们仍然持有r
报价,我们的客户代码可以写
r->setValue(0.015);
由于r
和curve
是共享指针,这也会改变索引内曲线副本的速率(因为curve
及其副本{{1}指向同一个对象)。因此,索引定价和相关工具值也将发生变化。
但是,假设我们想要开始使用另一条曲线。在这种情况下,我们可能希望切换到插值曲线而不是平曲线:
index
(在实际情况下,我们可能想要在不同的报价集上引导曲线或使用其他方式来模拟汇率)。
我们如何告诉vector<Date> dates = ... ;
vector<Rate> rates = ... ;
shared_ptr<YieldTermStructure> curve2 =
make_shared<ZeroCurve>(dates, rates, Actual360());
它应该开始使用index
?使用curve2
,我们不能。即使我们说:
shared_ptr
这会导致curve = curve2;
指向插值曲线,但curve
内的curve
的副本将继续指向旧的。index
。这不是shared_ptr
的问题,而是一般的指针。你是如何解决的?通过添加另一层间接。如果你使用原始指针,你将开始使用指针指针。在我们的代码中,Handle
执行相同的操作:它“指向”shared_ptr
,并且已实现,以便同一句柄的两个副本指向同一个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);
你以后可以写:
h.linkTo(curve2);
您持有的句柄及其在index
内的副本都将指向新曲线。
至于RelinkableHandle
和Handle
之间的区别:您只能在前者上调用linkTo
。我们的想法是您实例化RelinkableHandle
,将副本传递为Handle
,因此您确保除了您之外没有人可以更改它指向的内容(使用const
无效,因为constness可以通过简单的副本丢弃。)