<?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[Eigene Manipulatoren beim operator% in eigener Buffer-Klasse (wie bei streams)]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe einen bestehenden Code übernommen. Dort gibt es eine Bufferklasse.Bei dieser Klasse wurde der %-operator überladen, um verschiedene Datentypen in den Buffer einzufügen. Dies funktioniert auch.</p>
<p>Der folgende Code zeigt eine auf das Grundsätzliche reduzierte Klasse.</p>
<pre><code>#include &lt;vector&gt;

using namespace std;

class buffer 
{
    vector&lt;unsigned char&gt; m_buf;
    int m_pos;
    int m_key;

public:
    buffer() : m_key(0), m_pos(0) {}
    virtual ~buffer() {}

    void key(int keynr) {m_key = keynr; m_pos = 0;}    
    void reset() {m_pos = 0;}

    template&lt;typename T&gt;
    buffer&amp; operator%(T const&amp; value)
    {
        if (m_pos + sizeof T &gt; m_buf.size())
            m_buf.resize(m_pos + sizeof T);
        memcpy(m_buf.data() + m_pos, &amp;value, sizeof T);
        m_pos += sizeof T;
        return *this;
    }

    template&lt;&gt;
    buffer&amp; operator%&lt;std::string&gt;(const std::string&amp; s)
    {
        if (m_pos + s.length() &gt; m_buf.size())
            m_buf.resize(m_pos + s.length());
        memcpy(m_buf.data() + m_pos, s.data(), s.length());
        m_pos += static_cast&lt;int&gt;(s.length());
        return *this;
    }
};

// Dies sollte ein Manipulator ohne Parameter sein
buffer&amp; reset(buffer&amp; b)
{
    b.reset();
    return b;
}

// Dies sollte ein Manipulator mit 1 Parameter sein
buffer&amp; key(buffer&amp; b, int keynr)
{
    b.key(keynr);
    return b;
}

int main()
{
    buffer b;

    // b % key(1) % string(&quot;hallo&quot;) % reset() % int(2);
    // dies funktioniert leider nicht

	return 0;
}
</code></pre>
<p>Mein Ziel ist es jetzt diese Klasse um Manipulatoren zu erweitern. Mein Versuch der auf Anleitungen zu Streams beruht funktioniert nicht. Ich habe Manipulatoren ohne Parameter (siehe reset) und Manipulatoren mit 1 Parameter (siehe key).</p>
<p>Kann man dies mit C++ (Visual Studio 2010) lösen</p>
<p>Danke im Voraus</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/332341/eigene-manipulatoren-beim-operator-in-eigener-buffer-klasse-wie-bei-streams</link><generator>RSS for Node</generator><lastBuildDate>Tue, 28 Apr 2026 03:45:37 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/332341.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 23 Apr 2015 07:39:31 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Eigene Manipulatoren beim operator% in eigener Buffer-Klasse (wie bei streams) on Thu, 23 Apr 2015 07:39:31 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe einen bestehenden Code übernommen. Dort gibt es eine Bufferklasse.Bei dieser Klasse wurde der %-operator überladen, um verschiedene Datentypen in den Buffer einzufügen. Dies funktioniert auch.</p>
<p>Der folgende Code zeigt eine auf das Grundsätzliche reduzierte Klasse.</p>
<pre><code>#include &lt;vector&gt;

using namespace std;

class buffer 
{
    vector&lt;unsigned char&gt; m_buf;
    int m_pos;
    int m_key;

public:
    buffer() : m_key(0), m_pos(0) {}
    virtual ~buffer() {}

    void key(int keynr) {m_key = keynr; m_pos = 0;}    
    void reset() {m_pos = 0;}

    template&lt;typename T&gt;
    buffer&amp; operator%(T const&amp; value)
    {
        if (m_pos + sizeof T &gt; m_buf.size())
            m_buf.resize(m_pos + sizeof T);
        memcpy(m_buf.data() + m_pos, &amp;value, sizeof T);
        m_pos += sizeof T;
        return *this;
    }

    template&lt;&gt;
    buffer&amp; operator%&lt;std::string&gt;(const std::string&amp; s)
    {
        if (m_pos + s.length() &gt; m_buf.size())
            m_buf.resize(m_pos + s.length());
        memcpy(m_buf.data() + m_pos, s.data(), s.length());
        m_pos += static_cast&lt;int&gt;(s.length());
        return *this;
    }
};

// Dies sollte ein Manipulator ohne Parameter sein
buffer&amp; reset(buffer&amp; b)
{
    b.reset();
    return b;
}

// Dies sollte ein Manipulator mit 1 Parameter sein
buffer&amp; key(buffer&amp; b, int keynr)
{
    b.key(keynr);
    return b;
}

int main()
{
    buffer b;

    // b % key(1) % string(&quot;hallo&quot;) % reset() % int(2);
    // dies funktioniert leider nicht

	return 0;
}
</code></pre>
<p>Mein Ziel ist es jetzt diese Klasse um Manipulatoren zu erweitern. Mein Versuch der auf Anleitungen zu Streams beruht funktioniert nicht. Ich habe Manipulatoren ohne Parameter (siehe reset) und Manipulatoren mit 1 Parameter (siehe key).</p>
<p>Kann man dies mit C++ (Visual Studio 2010) lösen</p>
<p>Danke im Voraus</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2451304</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2451304</guid><dc:creator><![CDATA[Augustus]]></dc:creator><pubDate>Thu, 23 Apr 2015 07:39:31 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Manipulatoren beim operator% in eigener Buffer-Klasse (wie bei streams) on Thu, 23 Apr 2015 07:58:20 GMT]]></title><description><![CDATA[<p>Ähnlich wie die Stream-Klassen eigene Manipulatorklassen (imanip, omanip, smanip) benutzen (s. <a href="http://www.informit.com/articles/article.aspx?p=171014&amp;seqNum=2" rel="nofollow">Custom Manipulators for User-Defined Objects</a>), mußt du dann eine eigene Buffer-Manipulator-Klasse (buffer_manip) erzeugen und verwenden:</p>
<pre><code class="language-cpp">buffer_manip key(int keynr)
{
    return buffer_manip(&amp;key, keynr);
}
</code></pre>
<p>Und deine Buffer-Klasse müßte dann den operator% noch für den Parameter buffer_manip spezialisieren:</p>
<pre><code class="language-cpp">template&lt;&gt;
buffer&amp; operator%&lt;buffer_manip&gt;(const buffer_manip &amp;x)
</code></pre>
<p>Für die Implementierung von buffer_manip schau am besten in die o.g. Templates imanip&lt;T&gt; etc.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2451306</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2451306</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Thu, 23 Apr 2015 07:58:20 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Manipulatoren beim operator% in eigener Buffer-Klasse (wie bei streams) on Thu, 23 Apr 2015 08:30:08 GMT]]></title><description><![CDATA[<p>Danke für die Hinweise</p>
<p>für einen Manipulator ohne Parameter habe ich inzwischen eine einfache Lösung gefunden.<br />
Ich erweitere die Klasse um folgende Memberfunktion:</p>
<pre><code>buffer&amp; operator%(buffer&amp; (*fp)(buffer&amp;))
    {
        return fp(*this);
    }
</code></pre>
<p>Dieser Ansatz funktioniert nicht, wenn der manipulator Parameter hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2451310</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2451310</guid><dc:creator><![CDATA[Augustus]]></dc:creator><pubDate>Thu, 23 Apr 2015 08:30:08 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Manipulatoren beim operator% in eigener Buffer-Klasse (wie bei streams) on Thu, 23 Apr 2015 13:15:07 GMT]]></title><description><![CDATA[<p>Habe jetzt alles implementiert</p>
<p>Im &quot;Der C++-Programmierer&quot; von Ulrich Breymnann wird es im Kapitel 9 recht gut beschrieben.</p>
<p>Dank an Th69 für die Hinweise</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2451352</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2451352</guid><dc:creator><![CDATA[Augustus]]></dc:creator><pubDate>Thu, 23 Apr 2015 13:15:07 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Manipulatoren beim operator% in eigener Buffer-Klasse (wie bei streams) on Thu, 23 Apr 2015 15:20:26 GMT]]></title><description><![CDATA[<p>Bitte sehr <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";-)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2451377</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2451377</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Thu, 23 Apr 2015 15:20:26 GMT</pubDate></item></channel></rss>