<?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[Functoren]]></title><description><![CDATA[<p>hi,</p>
<p>ich hab 2 klassen</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
struct Blah_1 
{
  // Funktionsoperator
  void operator () (T &amp;rhs) 
  {
    // ...
  }
};

template &lt;typename T&gt;
struct Blah_2 :
{
  // Funktionsoperator
  void operator () (T &amp;rhs)
  {
    // ...
  }
};
</code></pre>
<p>je nachdem was im programm anfaellt ueber gebe ich einer funktion dann eine dieser beiden klassen:</p>
<pre><code class="language-cpp">template &lt;typename T&gt; 
template &lt;typename Functor&gt;
void Class_1&lt;T&gt;::BlahFasel_Func(/* Parameterlistr */, Functor Func)
{
  // Aufruf
  Func(/*Wert*/);
}
</code></pre>
<p>aufrufen tue ich das bisher so, hab immer alles doppelt (gerade bei schleifen unschoen).</p>
<pre><code class="language-cpp">template &lt;typename T&gt; 
void Class_1&lt;T&gt;::BlahFasel(/* Parameterlistr */)
{
  if (Irgendwas)
  { 
    Blah_1&lt;T&gt; Func;

    // Aufruf (Bsp)
    for (int i = 0; i &lt; 1000; ++i)
      BlahFasel_Func(/*Parameter*/, Func);
  }
  else
  {
    Blah_2&lt;T&gt; Func;

    // Aufruf (Bsp)
    for (int i = 0; i &lt; 1000; ++i)
      BlahFasel_Func(/*Parameter*/, Func);
  }
}
</code></pre>
<p>wie kann ich den aufruf von <strong>BlahFasel_Func</strong> nur noch einmal schreiben, also so:</p>
<pre><code class="language-cpp">template &lt;typename T&gt; 
void Class_1&lt;T&gt;::BlahFasel(/* Parameterlistr */)
{
  if (Irgendwas)
  { 
    Blah_1&lt;T&gt; Func;
  }
  else
  {
    Blah_2&lt;T&gt; Func;
  }

  // Aufruf
  for (int i = 0; i &lt; 1000; ++i)
    BlahFasel_Func(/*Parameter*/, Func);
}
</code></pre>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>irgendwie klappt das nicht, wenn ich fuer Blah_1 und Blah_2 ne basisklasse definiere von der beide erben, da dann der operator nicht aufgerufen wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/120673/functoren</link><generator>RSS for Node</generator><lastBuildDate>Sat, 22 Aug 2026 10:54:10 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/120673.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 15 Sep 2005 12:11:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Functoren on Thu, 15 Sep 2005 12:11:53 GMT]]></title><description><![CDATA[<p>hi,</p>
<p>ich hab 2 klassen</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
struct Blah_1 
{
  // Funktionsoperator
  void operator () (T &amp;rhs) 
  {
    // ...
  }
};

template &lt;typename T&gt;
struct Blah_2 :
{
  // Funktionsoperator
  void operator () (T &amp;rhs)
  {
    // ...
  }
};
</code></pre>
<p>je nachdem was im programm anfaellt ueber gebe ich einer funktion dann eine dieser beiden klassen:</p>
<pre><code class="language-cpp">template &lt;typename T&gt; 
template &lt;typename Functor&gt;
void Class_1&lt;T&gt;::BlahFasel_Func(/* Parameterlistr */, Functor Func)
{
  // Aufruf
  Func(/*Wert*/);
}
</code></pre>
<p>aufrufen tue ich das bisher so, hab immer alles doppelt (gerade bei schleifen unschoen).</p>
<pre><code class="language-cpp">template &lt;typename T&gt; 
void Class_1&lt;T&gt;::BlahFasel(/* Parameterlistr */)
{
  if (Irgendwas)
  { 
    Blah_1&lt;T&gt; Func;

    // Aufruf (Bsp)
    for (int i = 0; i &lt; 1000; ++i)
      BlahFasel_Func(/*Parameter*/, Func);
  }
  else
  {
    Blah_2&lt;T&gt; Func;

    // Aufruf (Bsp)
    for (int i = 0; i &lt; 1000; ++i)
      BlahFasel_Func(/*Parameter*/, Func);
  }
}
</code></pre>
<p>wie kann ich den aufruf von <strong>BlahFasel_Func</strong> nur noch einmal schreiben, also so:</p>
<pre><code class="language-cpp">template &lt;typename T&gt; 
void Class_1&lt;T&gt;::BlahFasel(/* Parameterlistr */)
{
  if (Irgendwas)
  { 
    Blah_1&lt;T&gt; Func;
  }
  else
  {
    Blah_2&lt;T&gt; Func;
  }

  // Aufruf
  for (int i = 0; i &lt; 1000; ++i)
    BlahFasel_Func(/*Parameter*/, Func);
}
</code></pre>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>irgendwie klappt das nicht, wenn ich fuer Blah_1 und Blah_2 ne basisklasse definiere von der beide erben, da dann der operator nicht aufgerufen wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/872768</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/872768</guid><dc:creator><![CDATA[Sunday]]></dc:creator><pubDate>Thu, 15 Sep 2005 12:11:53 GMT</pubDate></item><item><title><![CDATA[Reply to Functoren on Thu, 15 Sep 2005 12:45:48 GMT]]></title><description><![CDATA[<p>Wie genau sieht deine Basisklassenlösung aus? Hast du operator() in der Basisklasse pure virtual gemacht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/872825</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/872825</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Thu, 15 Sep 2005 12:45:48 GMT</pubDate></item><item><title><![CDATA[Reply to Functoren on Thu, 15 Sep 2005 13:00:56 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">template &lt;typename T&gt;
struct BasisBlah
{ 
  virtual void operator () (T &amp;rhs) = 0;
};

template &lt;typename T&gt;
struct Blah_1 : public BasisBlah
{
  // Funktionsoperator
  void operator () (T &amp;rhs) 
  {
    // ...
  }
};

template &lt;typename T&gt;
struct Blah_2 : public BasisBlah
{
  // Funktionsoperator
  void operator () (T &amp;rhs)
  {
    // ...
  }
};
</code></pre>
<p>dann mach ich folgendes:</p>
<pre><code class="language-cpp">BasisBlah&lt;T&gt; *Func;

if (Irgendetwas) Func = new Blah_1&lt;T&gt;;
else             Func = new Blah_2&lt;T&gt;;

BlahFunc(/*Parameter*/, Func);
</code></pre>
<p>damit bekomme ich dann nen Fehler wegen abstrakter Klasse.</p>
<pre><code class="language-cpp">template &lt;typename T&gt; 
template &lt;typename Functor&gt;
void BlahFunc(/*Parameter*/, Functor Func)
{ 
  Func(/*Wert*/);
}
</code></pre>
<p>irgendwie steh ich grad aufm schlauch.. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/872842</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/872842</guid><dc:creator><![CDATA[Sunday]]></dc:creator><pubDate>Thu, 15 Sep 2005 13:00:56 GMT</pubDate></item><item><title><![CDATA[Reply to Functoren on Fri, 16 Sep 2005 11:17:11 GMT]]></title><description><![CDATA[<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/873605</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/873605</guid><dc:creator><![CDATA[Sunday]]></dc:creator><pubDate>Fri, 16 Sep 2005 11:17:11 GMT</pubDate></item><item><title><![CDATA[Reply to Functoren on Fri, 16 Sep 2005 12:19:45 GMT]]></title><description><![CDATA[<p>Vielleicht beschwert er sich, weil du bei der Vererbungsliste bei BasisBlah die Templateparameter weglässt und somit von ner &quot;abstrakten Klasse&quot; erbst?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/873639</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/873639</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Fri, 16 Sep 2005 12:19:45 GMT</pubDate></item></channel></rss>