【发布时间】:2013-01-04 14:49:23
【问题描述】:
这个问题大致基于 Boost.Graph 库 (BGL),该库使用类似 Visitor 的模式来自定义递归(搜索)算法。 BGL 按值传递访问者对象(类似于 STL 函数对象)和documentation 状态
由于visitor参数是按值传递的,如果你的visitor包含状态,那么算法过程中对状态的任何改变都将复制到visitor对象,而不是传入的visitor对象。因此你可能想要visitor通过指针或引用保持此状态。
我的问题:实现有状态访问者类的引用语义的最佳方式是什么?从精确的指针类(原始与唯一与共享,常量与非常量)中抽象出来,放置引用的最佳位置是:在参数传递中还是在数据成员中?
替代1:访问者通过指针保持状态,并按值传递(如Boost.Graph)
class Visitor
{
public:
Visitor(): state_(new State()) {}
void start() { /* bla */ }
void finish() { /* mwa */ }
private:
State* state_;
}
template<typename Node, typename Visitor>
int algorithm(Node const& n, Visitor v)
{
v.start();
algorithm(next(n), v);
v.finish();
}
备选方案2:访问者按值保存数据,并按指针传递
class Visitor
{
public:
Visitor(): state_() {}
void start() { /* bla */ }
void finish() { /* mwa */ }
private:
State state_;
}
template<typename Node, typename Visitor>
int algorithm(Node const& n, Visitor* v)
{
v->start();
algorithm(next(n), v);
v->finish();
}
我目前的倾向:我发现备选方案 1 [传递持有指针/引用的对象的值] 有点不舒服,因为访问者不满足值语义,所以我宁愿做引用参数列表中的语义清晰 [备选方案 2]。这里是否有其他相关的考虑或替代方案?
【问题讨论】:
-
@drive-by downvoter:动机?
标签: c++ pass-by-reference pass-by-value boost-graph visitor-pattern