<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Visitor so ok?]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich benutze gerade zum ersten Mal Visitoren (wie in &quot;Design Patterns&quot; beschrieben). Dabei frage ich mich insbesondere, ob man die eigentliche Nutzung des Visitors kürzer machen kann als ich.</p>
<p>Meine abstrakte Visitorklasse ist</p>
<pre><code class="language-cpp">class Nd_Visitor
{
public:
	virtual void visit(Rev_Nd* n) { }
	virtual void visit(Rev_Tip_Nd* n) { }
	virtual void visit(Rev_Intern_Nd* n) { }
	virtual void visit(Rev_Coal_Nd* n) { }
	virtual void visit(Rev_Rec_Nd* n) { }
};
</code></pre>
<p>Die konkrete Visitorklasse sieht so aus</p>
<pre><code class="language-cpp">class To_Dot_Str_Visitor : public Nd_Visitor
{
private:
	Dot_Para m_dot_para;
	string m_str;
public:
	To_Dot_Str_Visitor(Dot_Para dot_para) : m_dot_para(dot_para) { }

	void visit(Rev_Nd* n);
	void visit(Rev_Tip_Nd* n);
	void visit(Rev_Intern_Nd* n);
	void visit(Rev_Coal_Nd* n);
	void visit(Rev_Rec_Nd* n);

	const Dot_Para&amp; dot_para() const { return m_dot_para; }
	operator string() { return m_str; }
};
</code></pre>
<p>Was mir nun seltsam erscheint ist, dass aus der bisherigen Zeile</p>
<pre><code class="language-cpp">ss &lt;&lt; node()-&gt;to_dot_string(dot_para);
</code></pre>
<p>bei Verwendung meines Visitors drei werden:</p>
<pre><code class="language-cpp">To_Dot_Str_Visitor vst(dot_para);
	node()-&gt;accept(&amp;vst);
	ss &lt;&lt; (string)vst;
</code></pre>
<p>Geht das irgendwie kompakter oder ist das bei Visitoren halt so?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/228413/visitor-so-ok</link><generator>RSS for Node</generator><lastBuildDate>Tue, 29 Sep 2026 15:15:13 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/228413.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 27 Nov 2008 19:38:47 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Visitor so ok? on Thu, 27 Nov 2008 19:38:47 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich benutze gerade zum ersten Mal Visitoren (wie in &quot;Design Patterns&quot; beschrieben). Dabei frage ich mich insbesondere, ob man die eigentliche Nutzung des Visitors kürzer machen kann als ich.</p>
<p>Meine abstrakte Visitorklasse ist</p>
<pre><code class="language-cpp">class Nd_Visitor
{
public:
	virtual void visit(Rev_Nd* n) { }
	virtual void visit(Rev_Tip_Nd* n) { }
	virtual void visit(Rev_Intern_Nd* n) { }
	virtual void visit(Rev_Coal_Nd* n) { }
	virtual void visit(Rev_Rec_Nd* n) { }
};
</code></pre>
<p>Die konkrete Visitorklasse sieht so aus</p>
<pre><code class="language-cpp">class To_Dot_Str_Visitor : public Nd_Visitor
{
private:
	Dot_Para m_dot_para;
	string m_str;
public:
	To_Dot_Str_Visitor(Dot_Para dot_para) : m_dot_para(dot_para) { }

	void visit(Rev_Nd* n);
	void visit(Rev_Tip_Nd* n);
	void visit(Rev_Intern_Nd* n);
	void visit(Rev_Coal_Nd* n);
	void visit(Rev_Rec_Nd* n);

	const Dot_Para&amp; dot_para() const { return m_dot_para; }
	operator string() { return m_str; }
};
</code></pre>
<p>Was mir nun seltsam erscheint ist, dass aus der bisherigen Zeile</p>
<pre><code class="language-cpp">ss &lt;&lt; node()-&gt;to_dot_string(dot_para);
</code></pre>
<p>bei Verwendung meines Visitors drei werden:</p>
<pre><code class="language-cpp">To_Dot_Str_Visitor vst(dot_para);
	node()-&gt;accept(&amp;vst);
	ss &lt;&lt; (string)vst;
</code></pre>
<p>Geht das irgendwie kompakter oder ist das bei Visitoren halt so?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1622103</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1622103</guid><dc:creator><![CDATA[ingobulla]]></dc:creator><pubDate>Thu, 27 Nov 2008 19:38:47 GMT</pubDate></item><item><title><![CDATA[Reply to Visitor so ok? on Thu, 27 Nov 2008 23:50:28 GMT]]></title><description><![CDATA[<p>Denke schon dass das kompakter geht. Die 2. und 3. Zeile kann man auf jeden Fall zusammenfassen:</p>
<pre><code class="language-cpp">template &lt;class O, class V&gt; typename V::result_type ApplyVisitor(V&amp; v, O&amp; o)
{
    o.Accept(v);
    return v.Result();
}

std::string foo()
{
    Object o;
    Visitor v(123);
    return ApplyVisitor(v, o);
}
</code></pre>
<p>Die Variante &quot;ApplyVisitor(Visitor(123), o);&quot; geht leider nicht (ausgenommen mit MSVC und anderen Compilern die sich diesbezüglich nicht an den Standard halten), da ApplyVisitor eine non-const Referenz auf den Visitor braucht, da &quot;Accept()&quot; vermutlich auch eine non-const Referenz brauchen wird. (Das alte &quot;r-value und non-const-ref&quot; Thema halt)<br />
Dies könnte man höchstens umgehen indem man der konkreten Visitor-Klasse eine ApplyTo Funktion spendiert:</p>
<pre><code class="language-cpp">class ConcreteVisitor : public AbstractVisitor
{
public:
    typedef std::string result_type;

    template &lt;class O&gt; std::string ApplyTo(O&amp; o)
    {
        o.Accept(*this);
        return m_result;
    }

    // implement AbstractVisitor...
    virtual void Visit(A&amp; a) { ... }
    virtual void Visit(B&amp; b) { ... }
    virtual void Visit(C&amp; c) { ... }

private:
    std::string m_result;
};

std::string foo()
{
    Object o;
    return ConcreteVisitor(123).ApplyTo(o);
}
</code></pre>
<p>Ich weiss aber nicht wie oft man soetwas wirklich mit einem Visitor machen wird, da der konkrete Typ des Visitors normalerweise dort wo man ihn auf Objekte anwendet nicht bekannt ist (warum sonst würde man einen Visitor brauchen?). Das impliziert dass der Visitor nicht dort erzeugt wird wo er angewendet wird (sonst würde man ja den konkreten Typ kennen), und das wiederum bedeutet dass man sowieso schon einen Zeiger oder eine Referenz auf den Visitor hat den/die man dann an ApplyVisitor übergeben kann.</p>
<p>Ich kann mir höchstens vorstellen dass es in Fällen Sinn machen kann wo man an einigen Stellen den Visitor braucht (weil der konkrete Typ nicht bekannt ist), an anderen Stellen der konkrete Typ aber bekannt ist, und man an diesen anderen Stellen den bestehenden Visitor-Code wiederverwenden möchte (weils ja keinen Sinn macht alles doppelt zu programmieren). In dem Fall würde es einem eine Zeile abnehmen. Weiss aber nicht ob das dafürsteht.</p>
<p>----</p>
<p>Ich hoffe ich habe jetzt keinen allzugrossen Unfug geschreiben <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1622221</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1622221</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 27 Nov 2008 23:50:28 GMT</pubDate></item></channel></rss>