この質問は、 Visitorのようなパターンを使用して再帰 (検索) アルゴリズムをカスタマイズする Boost.Graph ライブラリ (BGL) に大まかに基づいています。BGL はビジター オブジェクトを (STL 関数オブジェクトと同様に) 値で渡し、ドキュメントの状態
ビジター パラメータは値で渡されるため、ビジターに状態が含まれている場合、アルゴリズム中の状態の変更は、渡されたビジター オブジェクトではなく、ビジター オブジェクトのコピーに対して行われます。したがって、ビジターにこれを保持させたい場合があります。ポインタまたは参照による状態。
私の質問: ステートフル ビジター クラスの参照セマンティクスを実装する最良の方法は何ですか? 正確なポインター クラス (raw vs unique vs shared、const vs non-const) から抽象化すると、参照を配置するのに最適な場所は次のどれですか: パラメーターの受け渡しまたはデータ メンバーでしょうか?
代替案 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] . ここで関連する他の考慮事項や代替手段はありますか?