<?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[Unklarheiten im Bezug auf überladene Operatoren]]></title><description><![CDATA[<p>Hoi,<br />
ich möchte Boost.PropertyTree mit eigenen Werttypen nutzen und möchte deswegen Übersetzer implementieren. Das Ganze möchte ich über Streams abwickeln.</p>
<p>Nur was stimmt an meinem Ansatz nicht? (Denke der Sourcecode bedarf keiner Erklärung)</p>
<pre><code>// C++ Standard Library:
#include &lt;string&gt;
#include &lt;sstream&gt;

// Boost:
#include &lt;boost/optional.hpp&gt;

namespace Synthetic
{
    namespace Util
    {
        template&lt;typename Char, typename External&gt;
        struct StreambasedPropertyTranslator
        {
            typedef std::basic_string&lt;Char&gt; internal_type;
            typedef External external_type;

            boost::optional&lt;external_type&gt; get_value(internal_type const&amp; str)
            {
                if (!str.empty())
                {
                    external_type val;
                    std::basic_stringstream&lt;Char&gt; stream(str);
                    stream &gt;&gt; val;
                    if(stream)
                        return boost::optional&lt;external_type&gt;(val);
                }

                return boost::optional&lt;external_type&gt;(boost::none);
            }

            boost::optional&lt;internal_type&gt; put_value(external_type const&amp; b)
            {
                std::basic_stringstream&lt;Char&gt; stream;
                stream &lt;&lt; b;
                if(stream)
                    return boost::optional&lt;internal_type&gt;(stream.str());
                else
                    return boost::optional&lt;internal_type&gt;(boost::none);
            }
        };
    }
}
</code></pre>
<pre><code>// C++ Standard Library:
#include &lt;istream&gt;
#include &lt;ostream&gt;
#include &lt;limits&gt;

// SFML:
#include &lt;SFML/System/Vector2.hpp&gt;

// Synthetic:
#include &quot;StreambasedPropertyTranslator.hpp&quot;

namespace Synthetic
{
    namespace Util
    {
        // Syntax: (Value1, Value2)

        template&lt;typename ValueT&gt;
        std::basic_istream&lt;char&gt;&amp; operator&lt;&lt;(std::basic_istream&lt;char&gt;&amp; in,
            sf::Vector2&lt;ValueT&gt;&amp; out)
        {
            // Eat '('.
            in.ignore(std::numeric_limits&lt;std::streamsize&gt;::max(), '(');

            // Read first value.
            in &gt;&gt; out.x;

            // Eat ','.
            in.ignore(std::numeric_limits&lt;std::streamsize&gt;::max(), ',');

            // Read second value.
            in &gt;&gt; out.y;

            // Eat ')'.
            return in.ignore(std::numeric_limits&lt;std::streamsize&gt;::max(), ')');
        }

        template&lt;typename ValueT&gt;
        std::basic_ostream&lt;char&gt;&amp; operator&lt;&lt;(std::basic_ostream&lt;char&gt;&amp; out,
            sf::Vector2&lt;ValueT&gt; const&amp; in)
        {
            return out &lt;&lt; '(' &lt;&lt; in.x &lt;&lt; &quot;, &quot; &lt;&lt; in.y &lt;&lt; ')';
        }
    }
}

namespace boost
{
    namespace property_tree
    {
        template&lt;typename CharT, typename ValueT&gt;
        struct translator_between&lt;
            std::basic_string&lt;CharT&gt;, sf::Vector2&lt;ValueT&gt;&gt;
        {
            typedef Synthetic::Util::StreambasedPropertyTranslator&lt;
                CharT, sf::Vector2&lt;ValueT&gt;&gt; type;
        };
    }
}
</code></pre>
<p>Anwendung im Code dann wie folgt:</p>
<pre><code>config.get&lt;sf::Vector2&lt;float&gt;&gt;(&quot;Object1.Center&quot;);
</code></pre>
<p>Mir ist bewusst dass ich die Stream-Operatoren erst nach dem StreambasedPropertyTranslator definiere, aber da StreambasedPropertyTranslator ein Klassentemplate ist sollte das doch trotzdem so funktionieren?</p>
<p>Der Compiler beschwert sich jedenfalls über das Streamen in val hier, nämlich dass er keinen operator&gt;&gt; findet:</p>
<pre><code>...
external_type val;
std::basic_stringstream&lt;Char&gt; stream(str);
stream &gt;&gt; val;
...
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/312979/unklarheiten-im-bezug-auf-überladene-operatoren</link><generator>RSS for Node</generator><lastBuildDate>Sun, 02 Aug 2026 12:01:53 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/312979.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 18 Jan 2013 16:28:12 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Unklarheiten im Bezug auf überladene Operatoren on Fri, 18 Jan 2013 16:28:12 GMT]]></title><description><![CDATA[<p>Hoi,<br />
ich möchte Boost.PropertyTree mit eigenen Werttypen nutzen und möchte deswegen Übersetzer implementieren. Das Ganze möchte ich über Streams abwickeln.</p>
<p>Nur was stimmt an meinem Ansatz nicht? (Denke der Sourcecode bedarf keiner Erklärung)</p>
<pre><code>// C++ Standard Library:
#include &lt;string&gt;
#include &lt;sstream&gt;

// Boost:
#include &lt;boost/optional.hpp&gt;

namespace Synthetic
{
    namespace Util
    {
        template&lt;typename Char, typename External&gt;
        struct StreambasedPropertyTranslator
        {
            typedef std::basic_string&lt;Char&gt; internal_type;
            typedef External external_type;

            boost::optional&lt;external_type&gt; get_value(internal_type const&amp; str)
            {
                if (!str.empty())
                {
                    external_type val;
                    std::basic_stringstream&lt;Char&gt; stream(str);
                    stream &gt;&gt; val;
                    if(stream)
                        return boost::optional&lt;external_type&gt;(val);
                }

                return boost::optional&lt;external_type&gt;(boost::none);
            }

            boost::optional&lt;internal_type&gt; put_value(external_type const&amp; b)
            {
                std::basic_stringstream&lt;Char&gt; stream;
                stream &lt;&lt; b;
                if(stream)
                    return boost::optional&lt;internal_type&gt;(stream.str());
                else
                    return boost::optional&lt;internal_type&gt;(boost::none);
            }
        };
    }
}
</code></pre>
<pre><code>// C++ Standard Library:
#include &lt;istream&gt;
#include &lt;ostream&gt;
#include &lt;limits&gt;

// SFML:
#include &lt;SFML/System/Vector2.hpp&gt;

// Synthetic:
#include &quot;StreambasedPropertyTranslator.hpp&quot;

namespace Synthetic
{
    namespace Util
    {
        // Syntax: (Value1, Value2)

        template&lt;typename ValueT&gt;
        std::basic_istream&lt;char&gt;&amp; operator&lt;&lt;(std::basic_istream&lt;char&gt;&amp; in,
            sf::Vector2&lt;ValueT&gt;&amp; out)
        {
            // Eat '('.
            in.ignore(std::numeric_limits&lt;std::streamsize&gt;::max(), '(');

            // Read first value.
            in &gt;&gt; out.x;

            // Eat ','.
            in.ignore(std::numeric_limits&lt;std::streamsize&gt;::max(), ',');

            // Read second value.
            in &gt;&gt; out.y;

            // Eat ')'.
            return in.ignore(std::numeric_limits&lt;std::streamsize&gt;::max(), ')');
        }

        template&lt;typename ValueT&gt;
        std::basic_ostream&lt;char&gt;&amp; operator&lt;&lt;(std::basic_ostream&lt;char&gt;&amp; out,
            sf::Vector2&lt;ValueT&gt; const&amp; in)
        {
            return out &lt;&lt; '(' &lt;&lt; in.x &lt;&lt; &quot;, &quot; &lt;&lt; in.y &lt;&lt; ')';
        }
    }
}

namespace boost
{
    namespace property_tree
    {
        template&lt;typename CharT, typename ValueT&gt;
        struct translator_between&lt;
            std::basic_string&lt;CharT&gt;, sf::Vector2&lt;ValueT&gt;&gt;
        {
            typedef Synthetic::Util::StreambasedPropertyTranslator&lt;
                CharT, sf::Vector2&lt;ValueT&gt;&gt; type;
        };
    }
}
</code></pre>
<p>Anwendung im Code dann wie folgt:</p>
<pre><code>config.get&lt;sf::Vector2&lt;float&gt;&gt;(&quot;Object1.Center&quot;);
</code></pre>
<p>Mir ist bewusst dass ich die Stream-Operatoren erst nach dem StreambasedPropertyTranslator definiere, aber da StreambasedPropertyTranslator ein Klassentemplate ist sollte das doch trotzdem so funktionieren?</p>
<p>Der Compiler beschwert sich jedenfalls über das Streamen in val hier, nämlich dass er keinen operator&gt;&gt; findet:</p>
<pre><code>...
external_type val;
std::basic_stringstream&lt;Char&gt; stream(str);
stream &gt;&gt; val;
...
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2291082</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2291082</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Fri, 18 Jan 2013 16:28:12 GMT</pubDate></item><item><title><![CDATA[Reply to Unklarheiten im Bezug auf überladene Operatoren on Fri, 18 Jan 2013 16:31:30 GMT]]></title><description><![CDATA[<p>Holy Shit, da überlege ich mir ne halbe Ewigkeit was an meinem Konzept nicht stimmt und jetzt sehe ich dass ich ausversehen 2x operator&lt;&lt; geschrieben habe ... warum fällt mir soetwas erst auf nachdem ich es ins Forum gepostet habe?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2291084</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2291084</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Fri, 18 Jan 2013 16:31:30 GMT</pubDate></item><item><title><![CDATA[Reply to Unklarheiten im Bezug auf überladene Operatoren on Fri, 18 Jan 2013 18:16:10 GMT]]></title><description><![CDATA[<p><strong>Edit: Und schon wieder zum Affen gemacht, es lag an PropertyTree ... heute ist echt nicht mein Tag.</strong></p>
<p>Ist zwar jetzt Offtopic, aber damit der Thread irgendeinen Sinn hat:</p>
<pre><code>template&lt;typename ValueT&gt;
        std::basic_istream&lt;char&gt;&amp; operator&gt;&gt;(std::basic_istream&lt;char&gt;&amp; in,
            sf::Vector2&lt;ValueT&gt;&amp; out)
        {
            // Eat '('.
            in.ignore(std::numeric_limits&lt;std::streamsize&gt;::max(), '(');
            assert(in);

            // Read first value.
            in &gt;&gt; out.x;
            assert(in);

            // Eat ','.
            in.ignore(std::numeric_limits&lt;std::streamsize&gt;::max(), ',');
            assert(in);

            // Read second value.
            in &gt;&gt; out.y;
            assert(in);

            // Eat ')'.
            return in.ignore(std::numeric_limits&lt;std::streamsize&gt;::max(), ')');
        }
</code></pre>
<p>Warum knallt das beim zweiten Wert wenn der Inputstream &quot;(10, 10)&quot; ist?</p>
<p>Danke und Grüße,<br />
Ethon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2291100</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2291100</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Fri, 18 Jan 2013 18:16:10 GMT</pubDate></item></channel></rss>