<?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[STL: Probleme mit inserter]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe versucht bei Google oder hier ne Lösung zu finden, aber ich bekomme es einfach nicht hin. Ich möchte folgendes implementieren (ich weiß, so funktioniert es nicht):</p>
<pre><code class="language-cpp">class A
{
public:
    template&lt;typename T&gt; FindChildrenByType(std::insert_iterator&lt;T*&gt; i)
    {
        std::vector&lt;B&gt;::iterator it = m_children.begin();
        while(it != m_children.end())
        {
            T* t = dynamic_cast&lt;T*&gt;(*it);
            if(t != NULL)
            {
                *i++ = t;
            }
        }
    };
private:
    std::vector&lt;B*&gt; m_children;
};

//------------------------------------

class C : public B
{
};

//------------------------------------

void SomeMethod()
{
   std::vector&lt;C*&gt; v;
   myA.FindChildrenByType&lt;C&gt;(std::back_inserter&lt;std::vector&lt;C*&gt; &gt;(v));
}
</code></pre>
<p>So in der Richtung. Ich will in FindChildrenByType() halt nicht den Container vorschreiben.</p>
<p>Könnt mir da jemand auf die Sprünge helfen? Wäre wirklich super. Alle Beispiele, die ich gefunden habe, benutzen nur STL algorithm methoden wie copy oder so...</p>
<p>Tausend Dank,<br />
Data2</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/243930/stl-probleme-mit-inserter</link><generator>RSS for Node</generator><lastBuildDate>Sat, 19 Sep 2026 15:29:38 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/243930.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 23 Jun 2009 07:25:21 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to STL: Probleme mit inserter on Tue, 23 Jun 2009 07:25:21 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe versucht bei Google oder hier ne Lösung zu finden, aber ich bekomme es einfach nicht hin. Ich möchte folgendes implementieren (ich weiß, so funktioniert es nicht):</p>
<pre><code class="language-cpp">class A
{
public:
    template&lt;typename T&gt; FindChildrenByType(std::insert_iterator&lt;T*&gt; i)
    {
        std::vector&lt;B&gt;::iterator it = m_children.begin();
        while(it != m_children.end())
        {
            T* t = dynamic_cast&lt;T*&gt;(*it);
            if(t != NULL)
            {
                *i++ = t;
            }
        }
    };
private:
    std::vector&lt;B*&gt; m_children;
};

//------------------------------------

class C : public B
{
};

//------------------------------------

void SomeMethod()
{
   std::vector&lt;C*&gt; v;
   myA.FindChildrenByType&lt;C&gt;(std::back_inserter&lt;std::vector&lt;C*&gt; &gt;(v));
}
</code></pre>
<p>So in der Richtung. Ich will in FindChildrenByType() halt nicht den Container vorschreiben.</p>
<p>Könnt mir da jemand auf die Sprünge helfen? Wäre wirklich super. Alle Beispiele, die ich gefunden habe, benutzen nur STL algorithm methoden wie copy oder so...</p>
<p>Tausend Dank,<br />
Data2</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1731390</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1731390</guid><dc:creator><![CDATA[data2]]></dc:creator><pubDate>Tue, 23 Jun 2009 07:25:21 GMT</pubDate></item><item><title><![CDATA[Reply to STL: Probleme mit inserter on Tue, 23 Jun 2009 08:00:48 GMT]]></title><description><![CDATA[<p>data2 schrieb:</p>
<blockquote>
<p>Hi,</p>
<p>ich habe versucht bei Google oder hier ne Lösung zu finden, aber ich bekomme es einfach nicht hin. Ich möchte folgendes implementieren (ich weiß, so funktioniert es nicht):</p>
</blockquote>
<p>Fehlermeldung?</p>
<pre><code class="language-cpp">class A
{
public:
    template&lt;typename T&gt; FindChildrenByType(std::insert_iterator&lt;T*&gt; i)
    {
        std::vector&lt;B&gt;::iterator it = m_children.begin(); //FEHLER! std::vector&lt;B*&gt;::iterator müsste passen
        while(it != m_children.end())
        {
  /* ... */
</code></pre>
<p>Demnächst auch bitte dazuschreiben was du <em>erreichen</em> willst, nicht einfach Code hinrotzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1731422</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1731422</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 23 Jun 2009 08:00:48 GMT</pubDate></item><item><title><![CDATA[Reply to STL: Probleme mit inserter on Tue, 23 Jun 2009 08:06:47 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;vector&gt;
#include &lt;iterator&gt;

class B
{
public:
  virtual ~B()
  {
  }
};

class C: public B
{
};

class A
{
public:
  A()
  {
    m_children.push_back(new B);
    m_children.push_back(new B);
    m_children.push_back(new C);
    m_children.push_back(new B);
    m_children.push_back(new B);
    m_children.push_back(new C);
  }

  template&lt;typename T, template &lt;typename&gt; class It&gt;
  void FindChildrenByType(It&lt;std::vector&lt;T*&gt; &gt; i)
  {
    std::vector&lt;B*&gt;::iterator it = m_children.begin();

    while(it != m_children.end())
    {
      B* b = *it;
      T* t = dynamic_cast&lt;T*&gt;(b);

      if(t != NULL)
      {
        *i++ = t;
      }
      ++it;
    }
  };

private:
    std::vector&lt;B*&gt; m_children;
};

int main(int argc, char* argv[])
{
  std::vector&lt;C*&gt; v;

  A a;
  a.FindChildrenByType&lt;C&gt;(std::back_inserter&lt;std::vector&lt;C*&gt; &gt;(v));

  std::cout &lt;&lt; v.size() &lt;&lt; std::endl;
  return 0;
}
</code></pre>
<p>Sicherlich nicht 100% das, was du willst, wegen vector hardcoded</p>
<pre><code class="language-cpp">void FindChildrenByType(It&lt;std::vector&lt;T*&gt; &gt; i)
</code></pre>
<p>,<br />
aber ein bissl Spass willst du ja auch noch haben oder?<br />
Btw. schlechtes Minimalbeispiel mit x Fehlern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1731425</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1731425</guid><dc:creator><![CDATA[der_library_builder]]></dc:creator><pubDate>Tue, 23 Jun 2009 08:06:47 GMT</pubDate></item><item><title><![CDATA[Reply to STL: Probleme mit inserter on Tue, 23 Jun 2009 08:56:41 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9960">@pumuckl</a> Dachte, ich hätt' das erwähnt. Ich will von einer Klasse (class A), die eine Menge von Kindern von Typ B* hat, nur diejendigen Elemente erfragen, die von einem bestimmten Typ ableiten der von B ableitet (im Beispiel class C). Um nicht von irgendeinem bestimmten STL Container abzuhängen, wollte ich das über irgendeinem inserter oder insert_iterator oder was auch immer (dafür habe ich ja gepostet) lösen.</p>
<p>@der_library_builder Hmm, bei deiner Lösung könnt ich auch einfach ne Referenz auf nen std::vector&lt;T*&gt; übergeben und mit push_back die Treffer einfügen. Das mit den Fehlern tut mir Leid. Sollte auch eigentlich kein vollständiges Minimalbeispiel sein, sondern nur das skizzieren, was ich implementieren will. Hab's nur im Browser &quot;gecoded&quot;. Kann also schon rein, dass der ein oder andere Tippfehler drin ist...</p>
<p>Nun ja, gibt's denn ne Lösung, ohne von einem bestimmten Container abzuhängen? Bei std::copy geht's ja auch. Oder ist dort für jeden Container ne Überladung vorhanden? Leider kann ich die VC++ Implementierung von std::copy nicht nachvollziehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1731441</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1731441</guid><dc:creator><![CDATA[data2]]></dc:creator><pubDate>Tue, 23 Jun 2009 08:56:41 GMT</pubDate></item><item><title><![CDATA[Reply to STL: Probleme mit inserter on Tue, 23 Jun 2009 09:00:30 GMT]]></title><description><![CDATA[<p>Warum schreibst Du</p>
<pre><code class="language-cpp">template&lt;typename T&gt; FindChildrenByType(std::insert_iterator&lt;T*&gt; i)
</code></pre>
<p>statt</p>
<pre><code class="language-cpp">template&lt;typename T, typename OutputIterator&gt;  
    void FindChildrenByType(OutputIterator i)
</code></pre>
<p>?</p>
<p>Erstens passt der Parameter T* nicht zum Template insert_iterator weil's nicht der Container ist und zweitens benutzt Du unten auch einen back_insert_iterator.</p>
<p>Was Du wahrscheinlich damit ausdrücken wolltest war folgendes (C++0x):</p>
<pre><code class="language-cpp">template&lt;typename T, typename OutIter&gt;  
      requires oi = OutputIterator&lt;OutIter&gt;
            &amp;&amp; Convertible&lt;T*,oi::value_type&gt;  
    void FindChildrenByType(OutputIterator i)
</code></pre>
<p>In C++03 könntest Du das per SFINAE und type traits erreichen.</p>
<p>In <code>SomeMethod</code> brauchst Du den Template-Parameter für std::back_inserter auch nicht mit angeben. Dafür gibt's ja &quot;template argument deduction&quot;.</p>
<pre><code class="language-cpp">void SomeMethod()
{
   std::vector&lt;C*&gt; v;
   myA.FindChildrenByType&lt;C&gt;(std::back_inserter(v));
}
</code></pre>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1731444</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1731444</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Tue, 23 Jun 2009 09:00:30 GMT</pubDate></item><item><title><![CDATA[Reply to STL: Probleme mit inserter on Tue, 23 Jun 2009 09:09:30 GMT]]></title><description><![CDATA[<blockquote>
<p>Hmm, bei deiner Lösung könnt ich auch einfach ne Referenz auf nen std::vector&lt;T*&gt; übergeben und mit push_back die Treffer einfügen.</p>
</blockquote>
<p>Das sollte einen Weg veranschaulichen, ein wenig Eigeninitiative kann man schon erwarten oder? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
Aber bitte...:</p>
<pre><code class="language-cpp">#include &lt;vector&gt;
#include &lt;deque&gt;
#include &lt;iterator&gt;

class B
{
public:
  virtual ~B()
  {
  }
};

class C: public B
{
};

class A
{
public:
  A()
  {
    m_children.push_back(new B);
    m_children.push_back(new B);
    m_children.push_back(new C);
    m_children.push_back(new B);
    m_children.push_back(new B);
    m_children.push_back(new C);
  }

  template&lt;typename T, template &lt;typename T*&gt; class Container, template &lt;typename&gt; class It&gt;
  void FindChildrenByType(It&lt;Container&gt; i)
  {
    std::vector&lt;B*&gt;::iterator it = m_children.begin();

    while(it != m_children.end())
    {
      B* b = *it;
      T* t = dynamic_cast&lt;T*&gt;(b);

      if(t != NULL)
      {
        *i++ = t;
      }
      ++it;
    }
  };

private:
    std::vector&lt;B*&gt; m_children;
};

int main(int argc, char* argv[])
{
  std::vector&lt;C*&gt; v;
  std::deque&lt;C*&gt; d;

  A a;
  a.FindChildrenByType&lt;C&gt;(std::back_inserter&lt;std::vector&lt;C*&gt; &gt;(v));
  a.FindChildrenByType&lt;C&gt;(std::back_inserter&lt;std::deque&lt;C*&gt; &gt;(d));

  std::cout &lt;&lt; v.size() &lt;&lt; std::endl;
  std::cout &lt;&lt; d.size() &lt;&lt; std::endl;
  std::cin.get();
  return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1731450</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1731450</guid><dc:creator><![CDATA[der_library_builder]]></dc:creator><pubDate>Tue, 23 Jun 2009 09:09:30 GMT</pubDate></item><item><title><![CDATA[Reply to STL: Probleme mit inserter on Tue, 23 Jun 2009 09:21:41 GMT]]></title><description><![CDATA[<p>der_library_builder schrieb:</p>
<blockquote>
<blockquote>
<p>Hmm, bei deiner Lösung könnt ich auch einfach ne Referenz auf nen std::vector&lt;T*&gt; übergeben und mit push_back die Treffer einfügen.</p>
</blockquote>
<p>Das sollte einen Weg veranschaulichen, ein wenig Eigeninitiative kann man schon erwarten oder? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
Aber bitte...:</p>
</blockquote>
<p>Ja, könnt ich dir Recht geben, dass man Eigeninitiative erwarten kann. Ich mag es auch nicht, wenn Leute fragen, wie man einen int in einen long casten kann, ohne nachzudenken. Allerdings habe ich Konstrukte wie &quot;template &lt;typename T*&gt; class Container&quot; noch nie gesehen (kannte bisher nur &lt;typename X, typename Y, ...&gt;), und kappiere sie ganz abgesehen davon auch nicht wirklich. Insofern ist es ja nicht sehr verwunderlich, dass ich nicht in der Lage bin, per Eigeninitiative auf ne Lösung zu kommen, und hoffentlich nachvollziehbar, dass ich nochmal nachfrage.</p>
<p>Freut mich aber, da die Implementierung genau das macht, was ich wollte. Danke <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/1731455</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1731455</guid><dc:creator><![CDATA[data2]]></dc:creator><pubDate>Tue, 23 Jun 2009 09:21:41 GMT</pubDate></item></channel></rss>