这个问题大致基于 Boost.Graph 库 (BGL),它使用类似访问者的模式来自定义递归(搜索)算法。BGL 按值传递访问者对象(类似于 STL 函数对象)和文档状态
由于访问者参数是按值传递的,如果您的访问者包含状态,那么算法期间对状态的任何更改都将针对访问者对象的副本,而不是传入的访问者对象。因此您可能希望访问者持有这个通过指针或引用进行状态。
我的问题:实现有状态访问者类的引用语义的最佳方法是什么?从精确的指针类(原始与唯一与共享,常量与非常量)中抽象出来,放置引用的最佳位置是:在参数传递中还是在数据成员中?
备选方案 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] . 这里是否有其他相关的考虑或替代方案?