<?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[foreach mit Referenzen]]></title><description><![CDATA[<p>Da die Entwicklung bzw. Standardisierung von c++0x bzw. seine range-based for Schleife noch bis mind. 2011 andauern wird, wie ich befürchte, hab ich mich mal nach Alternativen umgesehen.<br />
Zum einen fielen mir Makros ein/auf, doch ich bin kein Fan davon, obwohl mich das BOOST_FOREACH Makro echt schwer beeindruckt hat, was ich wohl auch zukünftig nutzen werde, bis c++ endlich mal von Haus aus modern wird.</p>
<p>Doch trotz alledem wollte ich mir auch gerne mal etwas eigenes basteln, und möglichst auf Typkontrolle beharren, also was läge da näher als Templates.<br />
Gesagt getan:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;string&gt;
#include &lt;cstdio&gt;

namespace rs {
    template &lt;typename T&gt; void print (const std::vector&lt;T&gt; &amp; v, std::string flag = &quot;%d&quot;) {
        unsigned int counter = 1;

        std::string output, org_flag = flag;
        flag += &quot;, &quot;;
        for (T var; each(var, v); ++counter) {
            if (counter &gt;= v.size()) {
                flag = org_flag;
            }

            char temp[100];
            sprintf(temp, flag.c_str(), var);
            output += temp;
        }
        std::cout &lt;&lt; &quot;\n[&quot; &lt;&lt; output &lt;&lt; &quot;]\n&quot;;
    }

    template &lt;typename T&gt; bool each (T &amp; var, const std::vector&lt;T&gt; &amp; v) {
        static unsigned short index = 0;

        var = v[index++];
        if (index &gt; v.size()) {
            index = 0;

            return false;
        }

        return true;
    }
}

int main() {
    std::vector&lt;int&gt; v = { 8, 7, 6, 5, 4, 3, 2, 1, 0 };

    rs::print(v);

    for (int var; rs::each(var, v);) {
        std::cout &lt;&lt; var &lt;&lt; &quot;\n&quot;;

        ++var;
    }

    rs::print(v);
}
</code></pre>
<p>Allerdings kann ich diese Variable</p>
<pre><code class="language-cpp">var
</code></pre>
<p>lediglich als read-only verwenden, die erhöhung</p>
<pre><code class="language-cpp">++var
</code></pre>
<p>bringt nichts, außer dass der Wert von var erhöht wird, aber nicht der entsprechende Vektor - Member (v[0], v[1] ... etc.), dazu müsste ich var wohl jedesmal mit dem derzeitigen member vom Vektor initialisieren, um eine vordefinierte Referenz zu haben, jedenfalls funktioniert folgendes reibungslos:</p>
<pre><code class="language-cpp">int &amp;foo = v[0];
std::cout &lt;&lt; &quot;vor deklarierte Referenz:&quot; &lt;&lt;  foo;
++foo;
std::cout &lt;&lt; &quot;\nvor deklarierte Referenz und v[0]:&quot; &lt;&lt; foo &lt;&lt; &quot; : &quot; &lt;&lt; v[0] &lt;&lt; &quot;\n&quot;;
</code></pre>
<p>sowohl foo als auch v[0] sind erhöht worden.</p>
<p>Ich frage mich, wie ich, ähnlich wie in BOOST oder in der kommenden c++0x'er for Schleifen Version eine read-only <strong>und</strong> eine veränderliche Variante von var hinbekomme.<br />
Z.B. lässt sich ja mit</p>
<pre><code class="language-cpp">for (int &amp; x : v)
</code></pre>
<p>bzw. in BOOST</p>
<pre><code class="language-cpp">BOOST_FOREACH (int &amp; x, v)
</code></pre>
<p>x nun im Schleifenkörper beliebig verändern, so das diese Veränderungen auch Einfluss auf die jeweilige Memebervariablen vom Vektor haben.</p>
<p>Dieses Prinzip würde ich nur allzugern &quot;kopieren&quot; bzw. übernehmen in meine derzeitige Variante, wenn möglich ohne viel Code in/an die Anweisung</p>
<pre><code class="language-cpp">for (int var; each(var, v);)
</code></pre>
<p>zu stecken.</p>
<p>Würde mich über Kritik und Hinweise(n) sehr freuen.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/268740/foreach-mit-referenzen</link><generator>RSS for Node</generator><lastBuildDate>Mon, 31 Aug 2026 14:17:25 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/268740.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 14 Jun 2010 00:40:38 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to foreach mit Referenzen on Mon, 14 Jun 2010 00:43:35 GMT]]></title><description><![CDATA[<p>Da die Entwicklung bzw. Standardisierung von c++0x bzw. seine range-based for Schleife noch bis mind. 2011 andauern wird, wie ich befürchte, hab ich mich mal nach Alternativen umgesehen.<br />
Zum einen fielen mir Makros ein/auf, doch ich bin kein Fan davon, obwohl mich das BOOST_FOREACH Makro echt schwer beeindruckt hat, was ich wohl auch zukünftig nutzen werde, bis c++ endlich mal von Haus aus modern wird.</p>
<p>Doch trotz alledem wollte ich mir auch gerne mal etwas eigenes basteln, und möglichst auf Typkontrolle beharren, also was läge da näher als Templates.<br />
Gesagt getan:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;string&gt;
#include &lt;cstdio&gt;

namespace rs {
    template &lt;typename T&gt; void print (const std::vector&lt;T&gt; &amp; v, std::string flag = &quot;%d&quot;) {
        unsigned int counter = 1;

        std::string output, org_flag = flag;
        flag += &quot;, &quot;;
        for (T var; each(var, v); ++counter) {
            if (counter &gt;= v.size()) {
                flag = org_flag;
            }

            char temp[100];
            sprintf(temp, flag.c_str(), var);
            output += temp;
        }
        std::cout &lt;&lt; &quot;\n[&quot; &lt;&lt; output &lt;&lt; &quot;]\n&quot;;
    }

    template &lt;typename T&gt; bool each (T &amp; var, const std::vector&lt;T&gt; &amp; v) {
        static unsigned short index = 0;

        var = v[index++];
        if (index &gt; v.size()) {
            index = 0;

            return false;
        }

        return true;
    }
}

int main() {
    std::vector&lt;int&gt; v = { 8, 7, 6, 5, 4, 3, 2, 1, 0 };

    rs::print(v);

    for (int var; rs::each(var, v);) {
        std::cout &lt;&lt; var &lt;&lt; &quot;\n&quot;;

        ++var;
    }

    rs::print(v);
}
</code></pre>
<p>Allerdings kann ich diese Variable</p>
<pre><code class="language-cpp">var
</code></pre>
<p>lediglich als read-only verwenden, die erhöhung</p>
<pre><code class="language-cpp">++var
</code></pre>
<p>bringt nichts, außer dass der Wert von var erhöht wird, aber nicht der entsprechende Vektor - Member (v[0], v[1] ... etc.), dazu müsste ich var wohl jedesmal mit dem derzeitigen member vom Vektor initialisieren, um eine vordefinierte Referenz zu haben, jedenfalls funktioniert folgendes reibungslos:</p>
<pre><code class="language-cpp">int &amp;foo = v[0];
std::cout &lt;&lt; &quot;vor deklarierte Referenz:&quot; &lt;&lt;  foo;
++foo;
std::cout &lt;&lt; &quot;\nvor deklarierte Referenz und v[0]:&quot; &lt;&lt; foo &lt;&lt; &quot; : &quot; &lt;&lt; v[0] &lt;&lt; &quot;\n&quot;;
</code></pre>
<p>sowohl foo als auch v[0] sind erhöht worden.</p>
<p>Ich frage mich, wie ich, ähnlich wie in BOOST oder in der kommenden c++0x'er for Schleifen Version eine read-only <strong>und</strong> eine veränderliche Variante von var hinbekomme.<br />
Z.B. lässt sich ja mit</p>
<pre><code class="language-cpp">for (int &amp; x : v)
</code></pre>
<p>bzw. in BOOST</p>
<pre><code class="language-cpp">BOOST_FOREACH (int &amp; x, v)
</code></pre>
<p>x nun im Schleifenkörper beliebig verändern, so das diese Veränderungen auch Einfluss auf die jeweilige Memebervariablen vom Vektor haben.</p>
<p>Dieses Prinzip würde ich nur allzugern &quot;kopieren&quot; bzw. übernehmen in meine derzeitige Variante, wenn möglich ohne viel Code in/an die Anweisung</p>
<pre><code class="language-cpp">for (int var; each(var, v);)
</code></pre>
<p>zu stecken.</p>
<p>Würde mich über Kritik und Hinweise(n) sehr freuen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1911875</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1911875</guid><dc:creator><![CDATA[rswhite]]></dc:creator><pubDate>Mon, 14 Jun 2010 00:43:35 GMT</pubDate></item><item><title><![CDATA[Reply to foreach mit Referenzen on Mon, 14 Jun 2010 02:23:50 GMT]]></title><description><![CDATA[<p>Mir ist nicht ganz klar, warum du in print nicht schlicht einen stringstream benutzt. Oder gleich eine Funktion daraus machst, die einen string zurückgibt, den man auch anderweitig benutzen könnte. Oder eine Funktion, die das ganze in einen Stream schreibt. Oder, wenn syntaktischer Zucker das Ziel ist, einen Wrappertyp, um für ihn spezialisierte Operatoren zielsicher aussuchen zu können, etwa</p>
<pre><code class="language-cpp">#include &lt;cstddef&gt;
#include &lt;algorithm&gt;
#include &lt;iostream&gt;
#include &lt;iterator&gt;
#include &lt;vector&gt;

template&lt;typename container_t&gt;
class container_formatter_type {
public:
  container_formatter_type(container_t const &amp;data) : data_(data) { }

  container_t const &amp;get() const { return data_; }

private:
  container_t const &amp;data_;
};

template&lt;typename container_t&gt;
std::ostream &amp;operator&lt;&lt;(std::ostream &amp;out,
                         container_formatter_type&lt;container_t&gt; const &amp;what) {

  out &lt;&lt; &quot;[ &quot;;

  if(!what.get().empty()) {
    typename container_t::const_iterator e = what.get().end();
    --e;
    std::copy(what.get().begin(),
              e,
              std::ostream_iterator&lt;typename container_t::value_type&gt;(out, &quot;, &quot;));
    out &lt;&lt; *e &lt;&lt; ' ';
  }

  return out &lt;&lt; ']';
}

template&lt;typename container_t&gt;
container_formatter_type&lt;container_t&gt; container_formatter(container_t const &amp;c) {
  return c;
}

template&lt;typename T, std::size_t N&gt;
std::size_t array_size(T(&amp;)[N]) { return N; }

int main() {
  int data[] = { 3, 1, 4, 1, 5, 9 };

  std::vector&lt;int&gt; v(data, data + array_size(data));

  std::cout &lt;&lt; container_formatter(v) &lt;&lt; std::endl;
}
</code></pre>
<p>Jedenfalls etwas anderes, als im Backend ausgerechnet auf sprintf zurückzugreifen, was die ganze Typsicherheitsidee völlig ad absurdum führt und nur mit Basistypen überhaupt funktionieren kann.</p>
<p>Was each angeht, da ließe sich womöglich mit std::tr1::ref etwas drehen, <strong>aber</strong> deine each-Funktion ist weder thread- noch exceptionsicher. Ich würde ich hüten, etwas derartiges tatsächlich zu verwenden.</p>
<p>Das beste, was ich da so aus dem Stand anbieten kann, ist etwas in dieser Art:</p>
<pre><code class="language-cpp">#include &lt;algorithm&gt;
#include &lt;iterator&gt;
#include &lt;iostream&gt;
#include &lt;vector&gt;

template&lt;typename container_t&gt;
class ref_iter {
public:
  typedef container_t                        container_type;
  typedef typename container_type::iterator  iterator;
  typedef typename container_type::reference reference;

  ref_iter(container_type &amp;data)
    : data_(data),
      p_(data.begin()) { }

  operator reference() { return *p_; }
  bool advance() {
    if(p_ == data_.end()) { return false; }
    ++p_;
    return true;
  }

private:
  container_type &amp;data_;
  iterator p_;
};

int main() {
  int data[] = { 3, 1, 4, 1, 5, 9 };

  std::vector&lt;int&gt; v(data, data + 6);

  for(ref_iter&lt;std::vector&lt;int&gt; &gt; r(v); r.advance(); ) {
    ++r;
  }

  std::copy(v.begin(), v.end(), std::ostream_iterator&lt;int&gt;(std::cout, &quot;\n&quot;));

  return 0;
}
</code></pre>
<p>...aber das funktioniert nur eingeschränkt. Beispielsweise lassen Methoden des eigentlichen Wertes sich ohne Cast nicht aus der ref_iter-Instanz aufrufen. Einfach Iteratoren zu benutzen, scheint mir eigentlich die schönere Lösung zu sein; für eine je nach Geschmack etwas hübschere Syntax würde ich mich auf solche Scherze eher nicht einlassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1911876</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1911876</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Mon, 14 Jun 2010 02:23:50 GMT</pubDate></item><item><title><![CDATA[Reply to foreach mit Referenzen on Mon, 14 Jun 2010 08:26:27 GMT]]></title><description><![CDATA[<p>[quote=&quot;rswhite&quot;]</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
bool each (T &amp; var, const std::vector&lt;T&gt; &amp; v) {
    static unsigned short index = 0;
    var = v[index++];
    if (index &gt; v.size()) {
        index = 0;
        return false;
    }
    return true;
}
</code></pre>
<p>Eine <code>static</code> Variable? Sehr unschön, IMO.</p>
<p>rswhite schrieb:</p>
<blockquote>
<p>Würde mich über Kritik und Hinweise(n) sehr freuen.</p>
</blockquote>
<p>Dein <code>each</code> ist wegen der <code>static</code> -Variablen nicht Thread-sicher. Auch wenn man eine Schleife mal mit break abbricht, klappt's mit der nächsten Schleife nicht mehr.</p>
<p>Ich benutze BOOST_FOREACH nicht. Das ist mir zuviel schwarze Magie <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="🙂"
    /><br />
Aber ich freu mich schon auf C++0x.</p>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1911941</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1911941</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 14 Jun 2010 08:26:27 GMT</pubDate></item><item><title><![CDATA[Reply to foreach mit Referenzen on Mon, 14 Jun 2010 09:50:12 GMT]]></title><description><![CDATA[<p>Das klingt ja beinahe so, als müsste ich weiter mit der nun experimentellen etwas moderneren, aber immer noch vorsteinzeitlichen methode</p>
<pre><code class="language-cpp">for (auto iter = v.begin(); iter != v.end(); ++iter)
</code></pre>
<p>arbeiten. Ich glaub ich werd bis zur Geburtsstunde des modernen c++ erstmal bei Python bleiben.</p>
<p>Danke jedenfalls für die Hinweise vorallen mit der Thread Sicherheit in Bezug auf die static variable, daran hatte ich gar keinen Gedanken verschwendet.</p>
<p>die print Methode war ein schlichtes herum experimentieren die eig. der volllständigkeitshalber mit gepostet wurde, aber danke auch da für die Kritik <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/1911996</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1911996</guid><dc:creator><![CDATA[rswhite]]></dc:creator><pubDate>Mon, 14 Jun 2010 09:50:12 GMT</pubDate></item><item><title><![CDATA[Reply to foreach mit Referenzen on Mon, 14 Jun 2010 12:10:59 GMT]]></title><description><![CDATA[<p>Musst du nicht, mach einfach ein</p>
<pre><code class="language-cpp">#define foreach_e BOOST_FOREACH
#define foreach(NAME,CONTAINER)  foreach_e(auto&amp; NAME,CONTAINER)
...
foreach(p,parts)...
</code></pre>
<p>und gut ist.</p>
<p>Bei dem Komfort von foreach statt BOOST_FOREACH muss man allerdings darauf achten, dass man die eigenen Header nach andern Headern, die ebenfalls foreach verwenden (GTK+), einbindet. Das dürfte aber kaum ein Problem darstellen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912099</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912099</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Mon, 14 Jun 2010 12:10:59 GMT</pubDate></item><item><title><![CDATA[Reply to foreach mit Referenzen on Mon, 14 Jun 2010 16:00:19 GMT]]></title><description><![CDATA[<p>Jetzt muss ich aber doch mal eine Lanze für C++ brechen; insbesondere, wo ausgerechnet Python als Alternative genannt wurde (furchtbare Sprache, das).</p>
<p>Ich empfand und empfinde das Range-Konzept durch Iteratoren, wie es in C++ üblich ist, immer als äußerst flexibel. Konstrukte wie</p>
<pre><code class="language-cpp">for(int &amp;x : c) { ... }
</code></pre>
<p>mögen ja hübsch aussehen, aber sie sind eigentlich doch ziemlich starr. Was, wenn ich nur die erste Hälfte eines Containers verarbeiten will? Was, wenn ich gerade einen Stream bearbeite? Wenn ich einen eigenen Container entwickle und will, dass dieser mit Standardalgorithmen verwendbar ist?</p>
<p>Wenn du Iteratoren als &quot;steinzeitlich&quot; betrachtest, beschleicht mich der Verdacht, dass du nie wirklich mit ihnen gearbeitet hast. Ich für meinen Teil warte jedenfalls gespannter auf Lambda-Ausdrücke als auf for(int &amp;x : c).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912266</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912266</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Mon, 14 Jun 2010 16:00:19 GMT</pubDate></item><item><title><![CDATA[Reply to foreach mit Referenzen on Mon, 14 Jun 2010 16:25:32 GMT]]></title><description><![CDATA[<p>seldon schrieb:</p>
<blockquote>
<p>Jetzt muss ich aber doch mal eine Lanze für C++ brechen; insbesondere, wo ausgerechnet Python als Alternative genannt wurde (furchtbare Sprache, das).</p>
<p>Ich empfand und empfinde das Range-Konzept durch Iteratoren, wie es in C++ üblich ist, immer als äußerst flexibel. Konstrukte wie</p>
<pre><code class="language-cpp">for(int &amp;x : c) { ... }
</code></pre>
<p>mögen ja hübsch aussehen, aber sie sind eigentlich doch ziemlich starr. Was, wenn ich nur die erste Hälfte eines Containers verarbeiten will? Was, wenn ich gerade einen Stream bearbeite? Wenn ich einen eigenen Container entwickle und will, dass dieser mit Standardalgorithmen verwendbar ist?</p>
<p>Wenn du Iteratoren als &quot;steinzeitlich&quot; betrachtest, beschleicht mich der Verdacht, dass du nie wirklich mit ihnen gearbeitet hast. Ich für meinen Teil warte jedenfalls gespannter auf Lambda-Ausdrücke als auf for(int &amp;x : c).</p>
</blockquote>
<p>Nicht die Iteratoren ansich sind meiner Meinung steinzeitlich, aber dieses ellenlange konstrukt ist das, was wirklich viel schreibarbeit ausmacht. Durch</p>
<pre><code class="language-cpp">auto
</code></pre>
<p>wird diese schreckliche ausdehnung des codes ja gott sei dank erheblich minimiert, früher war ja</p>
<pre><code class="language-cpp">std::vector&lt;int&gt;::iterator iter;
</code></pre>
<p>noch von Nöten.</p>
<p>Was hast du denn eigentlich gegen Python? Eine so schlanke &amp; funktionale Sprache.<br />
Gezwungene Einrückung, keine Semikolons oder allzuviele Klammern, sei es &quot;{ }&quot; oder &quot;( )&quot;.<br />
bei</p>
<pre><code class="language-cpp">if (foo()) {
    anweisung();
}

// oder

for (int i = 0; i &lt; 5; i++) {
    anweisung();
}
</code></pre>
<p>würde meiner Meinung nach</p>
<pre><code class="language-cpp">if foo():
    anweisung()

// oder

for i in range(0, 5):
    anweisung()
</code></pre>
<p>absolut reichen, und genau das ermöglicht ja Python, es erspart Klammerhäufungen und Semikolons.<br />
Zudem ist die Sprache nicht so überladen wie C++ und wesentlich moderner <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/1912280</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912280</guid><dc:creator><![CDATA[rswhite]]></dc:creator><pubDate>Mon, 14 Jun 2010 16:25:32 GMT</pubDate></item><item><title><![CDATA[Reply to foreach mit Referenzen on Mon, 14 Jun 2010 17:23:28 GMT]]></title><description><![CDATA[<p>Naja, das mit der erzwungenen Einrückung und fehlenden Klammern ist mindestens Geschmacks- und zum großen Teil wohl auch Gewohnheitssache. Ich finde die fehlenden Klammern ziemlich unübersichtlich, und ich bin der Ansicht, dass ich besser als ein Interpreter weiß, wie mein Code organisiert gehört. Aber das ist nur Syntax und dementsprechend von untergeordneter Bedeutung.</p>
<p>Was du mit &quot;nicht so überladen&quot; und &quot;modern&quot; meinst, musst du mir zunächst erklären, so wie du es schreibst, sind das zunächst nur Buzzwörter; damit sollen sich die Sales-Leute herumschlagen. Funktional ist Python nicht, sondern hauptsächlich objektorientiert, und schlank...naja, die meisten Benchmarks behaupten etwas ganz anderes, was für eine interpretierte Sprache aber auch nicht weiter ungewöhnlich ist.</p>
<p>Mein Hauptproblem mit Python ist das völlig verkorkste Typsystem. Wenn mir jemand zu Laufzeit die Schnittstelle meiner Objekte verändern kann, kann ich mich nirgendwo mehr auf diese Schnittstelle verlassen, was umfassende Fehlerbehandlung so gut wie unmöglich und Debugging zu einer echten Qual macht. Irgendwelchen Kleinkram mag man damit noch zusammenhacken können, aber sobald das Projekt eine gewisse Größe erreicht und die Stabilität der Komponenten an Bedeutung gewinnt, ist das meines Erachtens völlig ausgeschlossen.</p>
<p>Aber zurück zu C++, immerhin sind wir ja im C++-Forum. Die Bedeutung des Schlüsselworts &quot;auto&quot; wird auch erst im nächsten Standard umdefiniert, und dann kriegst du ja auch deine Schleifensyntax. Bis dahin gibt es für solche Dinge typedef.</p>
<p>Insgesamt ist das neue auto und damit verbundene neue Sprachelemente wie decltype auch eher im Zusammenhang mit Funktionsvorlagen interessant, etwa</p>
<pre><code class="language-cpp">template&lt;typename T, typename U&gt;
auto add(T const &amp;t, U const &amp;u) -&gt; decltype(t + u) { return t + u; }
</code></pre>
<p>&quot;add&quot; jetzt natürlich nur als einfaches Beispiel. Wenn etwa T int und U double ist, will man da nicht int zurückgeben, und auf die Art kann man die Auswahl dem Compiler überlassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912316</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912316</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Mon, 14 Jun 2010 17:23:28 GMT</pubDate></item><item><title><![CDATA[Reply to foreach mit Referenzen on Mon, 14 Jun 2010 17:31:50 GMT]]></title><description><![CDATA[<p>seldon schrieb:</p>
<blockquote>
<p>Konstrukte wie</p>
<pre><code class="language-cpp">for(int &amp;x : c) { ... }
</code></pre>
<p>mögen ja hübsch aussehen, aber sie sind eigentlich doch ziemlich starr. Was, wenn ich nur die erste Hälfte eines Containers verarbeiten will?</p>
</blockquote>
<pre><code class="language-cpp">for(int &amp;x : make_pair(iter_anfang,iter_mitte))
{ ... }
</code></pre>
<p>seldon schrieb:</p>
<blockquote>
<p>Was, wenn ich gerade einen Stream bearbeite?</p>
</blockquote>
<p>Was soll damit sein?</p>
<p>seldon schrieb:</p>
<blockquote>
<p>Wenn ich einen eigenen Container entwickle und will, dass dieser mit Standardalgorithmen verwendbar ist?</p>
</blockquote>
<p>Mach doch. Du wirst ja sicherlich &lt;iterator&gt; dazu einbinden, um Deinen Iteratoren die entsprechende Iterator-Kategorie zu verpassen. Die Funktionstemplates std::begin und std::end (siehe §26.6.5) werden u.a. durch den &lt;iterator&gt; Header sichtbar. Wenn Dein Container also begin/end-Methoden anbietet und diese std::begin/end Funktionen sichtbar sind, wird auch automatisch die for-loop-Syntax mit Deinem Container funktionieren.</p>
<p>seldon schrieb:</p>
<blockquote>
<p>Wenn du Iteratoren als &quot;steinzeitlich&quot; betrachtest, beschleicht mich der Verdacht, dass du nie wirklich mit ihnen gearbeitet hast.</p>
</blockquote>
<p>Du wirst Doch wohl zugeben, dass das mit begin() und end() ein bissel nervig ist, oder?</p>
<p>seldon schrieb:</p>
<blockquote>
<p>Ich für meinen Teil warte jedenfalls gespannter auf Lambda-Ausdrücke als auf for(int &amp;x : c).</p>
</blockquote>
<p>Och, das ist eigentlich alles ganz nett, was C++0x bietet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912321</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912321</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 14 Jun 2010 17:31:50 GMT</pubDate></item><item><title><![CDATA[Reply to foreach mit Referenzen on Mon, 14 Jun 2010 17:42:23 GMT]]></title><description><![CDATA[<p>Krümelkacker schrieb:</p>
<blockquote>
<pre><code class="language-cpp">for(int &amp;x : make_pair(iter_anfang,iter_mitte))
{ ... }
</code></pre>
</blockquote>
<p>Ah, das ist praktisch zu wissen. Welches Iterator-Konzept wird dafür verlangt?</p>
<p>Krümelkacker schrieb:</p>
<blockquote>
<p>Du wirst Doch wohl zugeben, dass das mit begin() und end() ein bissel nervig ist, oder?</p>
</blockquote>
<p>Eigentlich hat es mich nie wirklich gestört. Das wird mich aber nicht daran hindern, den syntaktischen Zucker des neuen Standards auch zu benutzen.</p>
<p>Ich wollte dieses Syntaxkonstrukt nicht schlecht machen, ich bin lediglich der Ansicht, dass semantische Änderungen wichtiger sind.</p>
<p>Krümelkacker schrieb:</p>
<blockquote>
<p>Och, das ist eigentlich alles ganz nett, was C++0x bietet.</p>
</blockquote>
<p>Ich hab noch nicht alles davon im Detail studiert (das werde ich tun, wenn der Standard fertig ist), aber für Einiges ist &quot;ganz nett&quot; eine ziemliche Untertreibung. <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/1912331</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912331</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Mon, 14 Jun 2010 17:42:23 GMT</pubDate></item><item><title><![CDATA[Reply to foreach mit Referenzen on Mon, 14 Jun 2010 17:45:26 GMT]]></title><description><![CDATA[<p>rswhite schrieb:</p>
<blockquote>
<p>Zudem ist die Sprache nicht so überladen wie C++ und wesentlich moderner <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>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>seldon schrieb:</p>
<blockquote>
<p>Mein Hauptproblem mit Python ist das völlig verkorkste Typsystem.</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912334</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912334</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 14 Jun 2010 17:45:26 GMT</pubDate></item><item><title><![CDATA[Reply to foreach mit Referenzen on Mon, 14 Jun 2010 18:18:23 GMT]]></title><description><![CDATA[<p>seldon schrieb:</p>
<blockquote>
<p>Krümelkacker schrieb:</p>
<blockquote>
<pre><code class="language-cpp">for(int &amp;x : make_pair(iter_anfang,iter_mitte))
{ ... }
</code></pre>
</blockquote>
<p>Ah, das ist praktisch zu wissen. Welches Iterator-Konzept wird dafür verlangt?</p>
</blockquote>
<p>Nun, das wird in diesem Fall automatisch nach</p>
<pre><code class="language-cpp">{
  auto&amp;&amp; range = make_pair(iter_anfang,iter_mitte);
  for (auto it = begin(range), en = end(range);
       it != en; ++it)
  {
    int &amp;x = *it;
    { ... }
  }
}
</code></pre>
<p>umgewandelt, wobei die Bezeichner ( <code>range</code> , <code>it</code> , <code>en</code> ) wahrscheinlich in Wirklichkeit Doppel-Unterstriche beinhalten werden. Das entsprechende <code>begin</code> / <code>end</code> wird per ADL gefunden. In diesem Fall sind das <code>begin</code> / <code>end</code> aus <code>&lt;utility&gt;</code> , welches einfach <code>first</code> / <code>second</code> aus dem <code>pair</code> extrahiert. Wenn ich mich nicht irre, funktioniert das hier schon für Input-Iteratoren.</p>
<p>seldon schrieb:</p>
<blockquote>
<p>Krümelkacker schrieb:</p>
<blockquote>
<p>Och, das ist eigentlich alles ganz nett, was C++0x bietet.</p>
</blockquote>
<p>Ich hab noch nicht alles davon im Detail studiert (das werde ich tun, wenn der Standard fertig ist), aber für Einiges ist &quot;ganz nett&quot; eine ziemliche Untertreibung. <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>
</blockquote>
<p>Ja, gebe ich zu. <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>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912364</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912364</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 14 Jun 2010 18:18:23 GMT</pubDate></item><item><title><![CDATA[Reply to foreach mit Referenzen on Mon, 14 Jun 2010 21:38:11 GMT]]></title><description><![CDATA[<p>seldon schrieb:</p>
<blockquote>
<p>Was du mit &quot;nicht so überladen&quot; und &quot;modern&quot; meinst, musst du mir zunächst erklären, so wie du es schreibst, sind das zunächst nur Buzzwörter; damit sollen sich die Sales-Leute herumschlagen.</p>
</blockquote>
<p>Python bietet im Gegensatz zu C++ wenige oder weniger Mittel mit einer vielfachen Möglichkeits Anwendung an.<br />
Da du so auf Erkärungen beharrst, hier ein Beispiel:<br />
Ich möchte eine Liste aus den Inhalten eines Datei.<br />
Python</p>
<pre><code>v = list()
with open('test.dat') as f:
    v = [x for x in f.readlines()]

print(v)
</code></pre>
<pre><code class="language-cpp">std::fstream f;
f.open(&quot;test.dat&quot;, std::ios::in);

std::vector&lt;std::string&gt; v;
if (f.good()) {
	while (f.eof() == false) {
		std::string temp;

		getline(f, temp);
		v.push_back(temp);
	}
}

f.close();

for (std::vector&lt;std::string&gt;::const_iterator iter = v.begin(); iter != v.end(); ++iter) {
//for (auto iter = v.begin(); iter != v.end(); ++iter) {
	std::cout &lt;&lt; *iter &lt;&lt; std::endl;
}
</code></pre>
<p>ich sehe einen gewissen vorteil was Python betrifft.<br />
Aber auch das z.B. Vectoren etc. nicht zum Sprachkern sondern zur STL gehören ist für mich nicht ganz nachvollziehbar.<br />
Das und vieles andere ist für mich Beweis genug, das Python Schlanker und moderner ist.<br />
Was &quot;moderner&quot; angeht, wirst du mir aufgrund des 10 Jahre alten Standards von c++ nicht widersprechen können. Was die Typkontrolle in Python angeht, kann ich dir allerdings nur beipflichten.</p>
<p>Aber genug von der Diskussion ob C++ oder Python oder sonst was besser ist, eine perfekte Programmiersprache gibt es (leider) nicht.</p>
<p>P.S: ich lese mich gerade in D rein, bislang gefällt es mir ganz gut, C++ Abklatsch in Modern, auch wenn ich bislang nicht allzuviele libs dafür sehe^^</p>
<p>Was deine restlichen Argumente des neuen Standards betreffend angeht, stimme ich dir diesbezüglich zu, dass es natürlich noch weit mehr und interessantere Konstrukte in c++0x geben wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912486</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912486</guid><dc:creator><![CDATA[rswhite]]></dc:creator><pubDate>Mon, 14 Jun 2010 21:38:11 GMT</pubDate></item><item><title><![CDATA[Reply to foreach mit Referenzen on Mon, 14 Jun 2010 23:46:53 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<pre><code class="language-cpp">{
  auto&amp;&amp; range = make_pair(iter_anfang,iter_mitte);
  for (auto it = begin(range), en = end(range);
       it != en; ++it)
  {
    int &amp;x = *it;
    { ... }
  }
}
</code></pre>
<p>umgewandelt, wobei die Bezeichner ( <code>range</code> , <code>it</code> , <code>en</code> ) wahrscheinlich in Wirklichkeit Doppel-Unterstriche beinhalten werden. Das entsprechende <code>begin</code> / <code>end</code> wird per ADL gefunden. In diesem Fall sind das <code>begin</code> / <code>end</code> aus <code>&lt;utility&gt;</code> , welches einfach <code>first</code> / <code>second</code> aus dem <code>pair</code> extrahiert. Wenn ich mich nicht irre, funktioniert das hier schon für Input-Iteratoren.</p>
</blockquote>
<p>Werden dann std::begin/std::end benutzt, falls im Namensraum des angegebenen Ranges keine eigenen Funktionen definiert sind? Ich denke da an ein ähnliches Muster, wie es in Effective C++ für swap vorgeschlagen wird:</p>
<pre><code class="language-cpp">{
  using std::swap;
  swap(foo, bar);
}
</code></pre>
<p>wo, wenn sich im Namensraum von foo/bar ein swap befindet, dieses benutzt wird, und ansonsten std::swap.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19764">@rswhite</a>: In deinem Beispiel würde am Ende des Vektors noch ein leerer String eingeschoben. Besser so:</p>
<pre><code class="language-cpp">std::deque&lt;std::string&gt; lines;

{
  std::ifstream in(&quot;datei.txt&quot;);
  std::string line;

  while(std::getline(in, line)) {
    lines.push_back(line);
  }
}

std::copy(lines.begin(), lines.end(), std::ostream_iterator&lt;std::string&gt;(std::cout, &quot;\n&quot;));
</code></pre>
<p>Ist für mein Verständnis auch übersichtlicher. (deque hier deshalb, weil ich vorher nicht weiß, wie viele Zeilen in der Datei sind, und durch die Wiederverwendung von line spart man sich eine Menge Rumgewurste auf dem Heap)</p>
<p>Allerdings sind die Streams und ihre Supportklassen in der C++-Standardbibliothek eher auf Token-Verarbeitung ausgelegt. Beispielsweise geht folgendes:</p>
<pre><code class="language-cpp">std::istringstream in(&quot;3 1 4 1 5 9 2 6&quot;);
std::istream_iterator&lt;int&gt; iter_end;
std::vector&lt;int&gt; pi_ziffern(std::istream_iterator&lt;int&gt;(in), iter_end);
</code></pre>
<p>(dass iter_end eine eigene Zeile kriegt, liegt an einer Syntax-Eigenheit, nach der pi_ziffern sonst als Funktionsdeklaration geparst würde). Dabei könnte in ebensogut eine Datei voller Zahlen, std::cin, oder sonst irgendein Eingabestrom sein. Netzwerksocket, beispielsweise.</p>
<p>Ich denke nicht, dass C++ sich hier zu verstecken braucht.</p>
<p>Ansonsten - die Container sind in der Standardbibliothek, weil es schlicht keinen Grund gab, sie tiefer in der Sprache zu verwurzeln. Die Standardbibliothek muss eh von jedem Compiler implementiert werden. Ich vermute, dass str und list in Python eingebaute Datentypen sind, weil der Interpreter sie intern verwendet und sie daher von vornherein vorhanden sind.</p>
<p>Und ob &quot;neuer&quot; gleich &quot;moderner&quot; bedeutet, sei mal dahingestellt. COBOLs letzter Standard stammt beispielsweise aus dem Jahr 2002, mit so modernen Neuerungen wie Booleans und Fließkommazahlen. Was aber richtig ist, ist, dass es ein paar Dinge gibt, die ich gern in der Standardbibliothek sähe (und bald auch sehe), etwa Unicode-Strings und Nebenläufigkeitskonstrukte, die ich mir bisher aus anderer Quelle besorgen muss.</p>
<p>Zu D kann ich nicht viel sagen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912520</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912520</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Mon, 14 Jun 2010 23:46:53 GMT</pubDate></item><item><title><![CDATA[Reply to foreach mit Referenzen on Tue, 15 Jun 2010 15:12:02 GMT]]></title><description><![CDATA[<p>&lt;ot&gt;</p>
<p>rswhite schrieb:</p>
<blockquote>
<p>P.S: ich lese mich gerade in D rein, bislang gefällt es mir ganz gut</p>
</blockquote>
<p>Was liest Du denn? Ich denke, ich habe das meiste von dem, was man über D frei im Netz auf Anhieb finden kann, auch gelesen. Das schließt zB den Dr Dobbs Artikel &quot;The Case for D&quot; ein. Aber so richtig umgehauen hat mich bisher gar nichts davon. Wenn Du einen Link Tipp hast, her damit. <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>
<p>&lt;/ot&gt;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912802</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912802</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 15 Jun 2010 15:12:02 GMT</pubDate></item></channel></rss>