<?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[Benutzerdefinierte Manipulatoren für vector]]></title><description><![CDATA[<p>Hi,</p>
<p>ich möchte Manipulatoren definieren, so dass ich Objekte meiner Klassen auf verschiedenen Detailstufen mittels des &lt;&lt;-Operators ausgeben kann. Also z.B. eine Klasse Hook_Position entweder als</p>
<pre><code>id: 0
age: 4.5
relative_age: 4.5
non_rec_suc: 0
suc: 4
idx_in_suc: 0

mut_rate: 0
            0         1         2         3
A      0.6616    0.6616    0.1128    0.1128
C      0.1128    0.1128    0.6616    0.6616
G      0.1128    0.1128    0.1128    0.1128
T      0.1128    0.1128    0.1128    0.1128
</code></pre>
<p>oder als</p>
<pre><code>id: 0
</code></pre>
<p>Das habe ich (mich am Stroustrup orientierend) mittels der Klassentemplates</p>
<pre><code class="language-cpp">template&lt;class T&gt; class Base_Form
{
	friend std::ostream&amp; ::operator&lt;&lt;&lt;&gt;(std::ostream&amp; s, const Base_Bound_Form&lt;T&gt;&amp; bf);
private:
	unsigned m_level;   // Detailgrad
public:
	Base_Form(unsigned level) : m_level(level) { }
	Base_Bound_Form&lt;T&gt; operator()(const T* n) const { return Base_Bound_Form&lt;T&gt;(*this, n); }
	unsigned level() const { return m_level; }
};

template&lt;class T&gt; class Base_Bound_Form
{
private:
	const Base_Form&lt;T&gt;&amp; m_form;
	const T* m_data;
public:
	Base_Bound_Form(const Base_Form&lt;T&gt;&amp; form, const T* data) : m_form(form), m_data(data) { }
	const Base_Form&lt;T&gt;&amp; form() const { return m_form; }
	const T* data() const { return m_data; }
};
</code></pre>
<p>gemacht. Der &lt;&lt;-Operator für Base_Bound_Form&lt;Hook_Position&gt; ist wie folgt definiert (Details sind irrelevant):</p>
<pre><code class="language-cpp">template&lt;&gt; std::ostream&amp; operator&lt;&lt;(std::ostream&amp; s, const Base_Bound_Form&lt;Hook_Position&gt;&amp; bf)
{
	bf.form().level();
	unsigned level = bf.form().level();
	const Hook_Position* hp = bf.data();

	switch (level) {
	case 0:
		s &lt;&lt; hp-&gt;ID &lt;&lt; endl;
		break;
	default:
		s &lt;&lt; &quot;id: &quot; &lt;&lt; hp-&gt;ID &lt;&lt; endl;
		s &lt;&lt; &quot;age: &quot; &lt;&lt; hp-&gt;m_age &lt;&lt; endl;
		s &lt;&lt; &quot;relative_age: &quot; &lt;&lt; hp-&gt;relative_age() &lt;&lt; endl;
		s &lt;&lt; &quot;non_rec_suc: &quot; &lt;&lt; hp-&gt;m_non_rec_suc-&gt;name() &lt;&lt; endl;
		s &lt;&lt; &quot;suc: &quot; &lt;&lt; hp-&gt;m_suc-&gt;name() &lt;&lt; endl;
		s &lt;&lt; &quot;idx_in_suc: &quot; &lt;&lt; hp-&gt;m_idx_in_suc &lt;&lt; endl &lt;&lt; endl;
		if (Prob_Nd* n = dynamic_cast&lt;Prob_Nd*&gt;(hp-&gt;non_rec_suc())) {
			Base_NNP* probs = n-&gt;probs(type&lt;Base_NNP&gt;());
			for (unsigned mr = 0; mr &lt; hp-&gt;tree()-&gt;num_mutation_rates(); ++mr) {
				s &lt;&lt; &quot;mut_rate: &quot; &lt;&lt; mr &lt;&lt; endl;
				s &lt;&lt; &quot;   &quot;;
				for (unsigned site = 0; site &lt; hp-&gt;non_rec_suc()-&gt;num_sites(); ++site) {
					s &lt;&lt; format(&quot;%10d&quot;) % site;
				}
				s &lt;&lt; endl;
				for (unsigned nucl = 0; nucl &lt; NUM_NUCL; ++nucl) {
					s &lt;&lt; Constants::alphabet().character(nucl) &lt;&lt; &quot;  &quot;;
					for (unsigned site = 0; site &lt; hp-&gt;non_rec_suc()-&gt;num_sites(); ++site) {
						double p = probs-&gt;lnp_at_hook_position(hp-&gt;m_idx_in_suc,
								site, mr, nucl);
						s &lt;&lt; format(&quot;%10.4f&quot;) % exp(p);
					}
					s &lt;&lt; endl;
				}

			}
		}
		else
			throw ERROR(logger, &quot;not implemented&quot;);
		break;
	}

	return s;
}
</code></pre>
<p>Die Ausgabe erfolgt mittels</p>
<pre><code class="language-cpp">Hook_Position hp = ...;
cout &lt;&lt; Base_Bound_Form&lt;Hook_Position&gt;(Base_Form&lt;Hook_Position&gt;(0), &amp;hp) &lt;&lt; endl;
</code></pre>
<p>Das läuft alles soweit wie es soll, aber nun würde ich das Ganze gerne erweitern, so dass ich auch einen vector&lt;Hook_Position&gt; ausgeben und den Detailgrad auch mittels Manipulatoren festlegen kann.</p>
<p>Hat jemand eine Idee, wie man das am besten macht?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/282226/benutzerdefinierte-manipulatoren-für-vector</link><generator>RSS for Node</generator><lastBuildDate>Sun, 23 Aug 2026 08:56:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/282226.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 16 Feb 2011 11:34:35 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Benutzerdefinierte Manipulatoren für vector on Wed, 16 Feb 2011 11:34:35 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich möchte Manipulatoren definieren, so dass ich Objekte meiner Klassen auf verschiedenen Detailstufen mittels des &lt;&lt;-Operators ausgeben kann. Also z.B. eine Klasse Hook_Position entweder als</p>
<pre><code>id: 0
age: 4.5
relative_age: 4.5
non_rec_suc: 0
suc: 4
idx_in_suc: 0

mut_rate: 0
            0         1         2         3
A      0.6616    0.6616    0.1128    0.1128
C      0.1128    0.1128    0.6616    0.6616
G      0.1128    0.1128    0.1128    0.1128
T      0.1128    0.1128    0.1128    0.1128
</code></pre>
<p>oder als</p>
<pre><code>id: 0
</code></pre>
<p>Das habe ich (mich am Stroustrup orientierend) mittels der Klassentemplates</p>
<pre><code class="language-cpp">template&lt;class T&gt; class Base_Form
{
	friend std::ostream&amp; ::operator&lt;&lt;&lt;&gt;(std::ostream&amp; s, const Base_Bound_Form&lt;T&gt;&amp; bf);
private:
	unsigned m_level;   // Detailgrad
public:
	Base_Form(unsigned level) : m_level(level) { }
	Base_Bound_Form&lt;T&gt; operator()(const T* n) const { return Base_Bound_Form&lt;T&gt;(*this, n); }
	unsigned level() const { return m_level; }
};

template&lt;class T&gt; class Base_Bound_Form
{
private:
	const Base_Form&lt;T&gt;&amp; m_form;
	const T* m_data;
public:
	Base_Bound_Form(const Base_Form&lt;T&gt;&amp; form, const T* data) : m_form(form), m_data(data) { }
	const Base_Form&lt;T&gt;&amp; form() const { return m_form; }
	const T* data() const { return m_data; }
};
</code></pre>
<p>gemacht. Der &lt;&lt;-Operator für Base_Bound_Form&lt;Hook_Position&gt; ist wie folgt definiert (Details sind irrelevant):</p>
<pre><code class="language-cpp">template&lt;&gt; std::ostream&amp; operator&lt;&lt;(std::ostream&amp; s, const Base_Bound_Form&lt;Hook_Position&gt;&amp; bf)
{
	bf.form().level();
	unsigned level = bf.form().level();
	const Hook_Position* hp = bf.data();

	switch (level) {
	case 0:
		s &lt;&lt; hp-&gt;ID &lt;&lt; endl;
		break;
	default:
		s &lt;&lt; &quot;id: &quot; &lt;&lt; hp-&gt;ID &lt;&lt; endl;
		s &lt;&lt; &quot;age: &quot; &lt;&lt; hp-&gt;m_age &lt;&lt; endl;
		s &lt;&lt; &quot;relative_age: &quot; &lt;&lt; hp-&gt;relative_age() &lt;&lt; endl;
		s &lt;&lt; &quot;non_rec_suc: &quot; &lt;&lt; hp-&gt;m_non_rec_suc-&gt;name() &lt;&lt; endl;
		s &lt;&lt; &quot;suc: &quot; &lt;&lt; hp-&gt;m_suc-&gt;name() &lt;&lt; endl;
		s &lt;&lt; &quot;idx_in_suc: &quot; &lt;&lt; hp-&gt;m_idx_in_suc &lt;&lt; endl &lt;&lt; endl;
		if (Prob_Nd* n = dynamic_cast&lt;Prob_Nd*&gt;(hp-&gt;non_rec_suc())) {
			Base_NNP* probs = n-&gt;probs(type&lt;Base_NNP&gt;());
			for (unsigned mr = 0; mr &lt; hp-&gt;tree()-&gt;num_mutation_rates(); ++mr) {
				s &lt;&lt; &quot;mut_rate: &quot; &lt;&lt; mr &lt;&lt; endl;
				s &lt;&lt; &quot;   &quot;;
				for (unsigned site = 0; site &lt; hp-&gt;non_rec_suc()-&gt;num_sites(); ++site) {
					s &lt;&lt; format(&quot;%10d&quot;) % site;
				}
				s &lt;&lt; endl;
				for (unsigned nucl = 0; nucl &lt; NUM_NUCL; ++nucl) {
					s &lt;&lt; Constants::alphabet().character(nucl) &lt;&lt; &quot;  &quot;;
					for (unsigned site = 0; site &lt; hp-&gt;non_rec_suc()-&gt;num_sites(); ++site) {
						double p = probs-&gt;lnp_at_hook_position(hp-&gt;m_idx_in_suc,
								site, mr, nucl);
						s &lt;&lt; format(&quot;%10.4f&quot;) % exp(p);
					}
					s &lt;&lt; endl;
				}

			}
		}
		else
			throw ERROR(logger, &quot;not implemented&quot;);
		break;
	}

	return s;
}
</code></pre>
<p>Die Ausgabe erfolgt mittels</p>
<pre><code class="language-cpp">Hook_Position hp = ...;
cout &lt;&lt; Base_Bound_Form&lt;Hook_Position&gt;(Base_Form&lt;Hook_Position&gt;(0), &amp;hp) &lt;&lt; endl;
</code></pre>
<p>Das läuft alles soweit wie es soll, aber nun würde ich das Ganze gerne erweitern, so dass ich auch einen vector&lt;Hook_Position&gt; ausgeben und den Detailgrad auch mittels Manipulatoren festlegen kann.</p>
<p>Hat jemand eine Idee, wie man das am besten macht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2021733</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2021733</guid><dc:creator><![CDATA[ingobulla]]></dc:creator><pubDate>Wed, 16 Feb 2011 11:34:35 GMT</pubDate></item></channel></rss>