<?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[virtuelle Methodentemplates?]]></title><description><![CDATA[<p>Ich weiss, template-methoden koennen nicht virtuell sein, ich habe aber folgendes Problem: Ich habe eine Klasse A, die Objekte beliebigen Typs aufnehmen und abgeben soll, und sie beim Abgeben auch noch in einen evtl. anderen Typ konvertieren soll, bsp:</p>
<pre><code class="language-cpp">class A {
public:
  template &lt;typename T&gt;
  void take(T const&amp; t);

  template &lt;typename U&gt;
  U give();
};

int main() {
  A a;
  int i = 15;
  a.take(i);
  double d = a.give&lt;double&gt;();
}
</code></pre>
<p>auf dem Weg wuerde ja saemtliche Typinformation verlorengehen, daher weiss ich nicht, ob sowas ueberhaupt moeglich ist. Gibts irgendwelche Ansaetze, das zu erreichen, ohne A selbst zum template zu machen? (in dem Falle waere es ja leicht)</p>
<p>Den Threadtitel habe ich deshalb gewaehlt, weil ich ueberlegt hatte, eien Typ Holder&lt;T&gt; zu schrieben, der das uebergebene Objekt haelt und A einen Pointer auf eine Basisklasse aller Holder zu geben:</p>
<pre><code class="language-cpp">struct basic_holder {
  template&lt;typename U&gt;
  virtual U give() = 0;  // geht nicht in C++ !
};

template &lt;typename T&gt;
struct Holder : public basic_holder {
  T mem;  

  Holder(const T&amp; t) : mem(t) {}

  template&lt;typename U&gt;
  virtual U give() {return mem}
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/206429/virtuelle-methodentemplates</link><generator>RSS for Node</generator><lastBuildDate>Sat, 10 Oct 2026 14:48:43 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/206429.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 25 Feb 2008 08:13:23 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to virtuelle Methodentemplates? on Mon, 25 Feb 2008 08:18:30 GMT]]></title><description><![CDATA[<p>Ich weiss, template-methoden koennen nicht virtuell sein, ich habe aber folgendes Problem: Ich habe eine Klasse A, die Objekte beliebigen Typs aufnehmen und abgeben soll, und sie beim Abgeben auch noch in einen evtl. anderen Typ konvertieren soll, bsp:</p>
<pre><code class="language-cpp">class A {
public:
  template &lt;typename T&gt;
  void take(T const&amp; t);

  template &lt;typename U&gt;
  U give();
};

int main() {
  A a;
  int i = 15;
  a.take(i);
  double d = a.give&lt;double&gt;();
}
</code></pre>
<p>auf dem Weg wuerde ja saemtliche Typinformation verlorengehen, daher weiss ich nicht, ob sowas ueberhaupt moeglich ist. Gibts irgendwelche Ansaetze, das zu erreichen, ohne A selbst zum template zu machen? (in dem Falle waere es ja leicht)</p>
<p>Den Threadtitel habe ich deshalb gewaehlt, weil ich ueberlegt hatte, eien Typ Holder&lt;T&gt; zu schrieben, der das uebergebene Objekt haelt und A einen Pointer auf eine Basisklasse aller Holder zu geben:</p>
<pre><code class="language-cpp">struct basic_holder {
  template&lt;typename U&gt;
  virtual U give() = 0;  // geht nicht in C++ !
};

template &lt;typename T&gt;
struct Holder : public basic_holder {
  T mem;  

  Holder(const T&amp; t) : mem(t) {}

  template&lt;typename U&gt;
  virtual U give() {return mem}
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1462306</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1462306</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 25 Feb 2008 08:18:30 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Methodentemplates? on Mon, 25 Feb 2008 15:16:57 GMT]]></title><description><![CDATA[<p>Hm, keiner einen Ansatz? Dann wirds wohl darauf hinauslaufen, dass A ein Klassentemplate wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1462561</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1462561</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 25 Feb 2008 15:16:57 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Methodentemplates? on Mon, 25 Feb 2008 16:48:19 GMT]]></title><description><![CDATA[<p>hilft dir <a href="http://schornboeck.net/artikel/virtual_template.htm" rel="nofollow">http://schornboeck.net/artikel/virtual_template.htm</a> ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1462641</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1462641</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Mon, 25 Feb 2008 16:48:19 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Methodentemplates? on Tue, 26 Feb 2008 07:07:09 GMT]]></title><description><![CDATA[<p>Soweit ich das überblicken kann nicht, leider. Ich habe folgendes:</p>
<p>- eine Klassenhierarchie für arithmetische und logische Ausdrücke</p>
<pre><code class="language-cpp">class primal_expression {
};

template &lt;typename Rtype&gt;
struct basic_expression : public primal_expression {
  typedef Rtype result_type;
};

template &lt;typename Rtype, typename LArgtype, typename RArgtype&gt;
struct binary_expression : public basic_expression&lt;Rtype&gt; {
  typedef LArgtype left_argument_type;
  typedef RArgtype right_argument_type;
};

//abgeleitet davon korrespondierende Ausdrücke zu allen möglichen operatoren
</code></pre>
<p>Da ich für komplizierte geschachtelte Ausdrücke ebenso komplizierte template-typen erhalte, wollte ich eine Klasse Expression haben, die einen Zeiger auf primal_expression enthält und per Methodentemplate das Ergebnis des Ausdrucks im gewünschten Typ zurückgibt (wenn die Konvertierung möglich ist)</p>
<pre><code class="language-cpp">Class Expression {
primal_expression* exp;
public:
  template&lt;class T&gt;
  T evaluate();
};
</code></pre>
<p>Da es aber wohl schwer wird zur Laufzeit zu prüfen, ob eine gewünschte Typkonvertierung möglich ist, muss ich mir wohl was anderes überlegen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1462974</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1462974</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 26 Feb 2008 07:07:09 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Methodentemplates? on Tue, 26 Feb 2008 21:49:19 GMT]]></title><description><![CDATA[<p>wieso fängst du deine klassen-hierarchie nicht mit</p>
<pre><code class="language-cpp">template &lt;class T&gt; class expression
{
public:
    typedef T result_type;
    virtual T get_result() const = 0;
};
</code></pre>
<p>oder etwas ähnlichem an?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1463653</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1463653</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 26 Feb 2008 21:49:19 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Methodentemplates? on Wed, 27 Feb 2008 07:37:06 GMT]]></title><description><![CDATA[<p>das wäre dann bei mir die basic_expresion. Ds bringt mich aber auch nicht weiter, wenn ich eine (templatelose) Klasse als Behälter für alle möglichen Ausdrücke (mit verschiedenen Rückgabetypen) haben möchte. In so einer klasse müsste ich einen Pointer auf primal_expression haben, wo dann nurnoch im dynamischen Typ die Information über den Rückgabetyp steckt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1463749</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1463749</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 27 Feb 2008 07:37:06 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Methodentemplates? on Wed, 27 Feb 2008 13:45:34 GMT]]></title><description><![CDATA[<p>Weiss nicht, so vielleicht:</p>
<pre><code class="language-cpp">class any_result_wrapper
{
public:
    virtual ~any_result_wrapper() {}
    virtual type_info const&amp; get_result_type_info() const = 0;
    // + was du halt sonst noch brauchst
};

template &lt;class T&gt; class basic_result_wrapper : public any_result_wrapper
{
public:
    typedef T result_type;

    basic_result_wrapper(T const&amp; t) :
        m_result(t)
    {
    }

    virtual T get_result() const
    {
        return m_result;
    }

    virtual type_info const&amp; get_result_type_info() const
    {
        return typeid(T);
    }

private:
    T m_result;
};

class any_expression
{
public:
    virtual type_info const&amp; get_result_type_info() const = 0;
    virtual boost::shared_ptr&lt;any_result_wrapper&gt; get_any_result() const = 0;
}; 

template &lt;class T&gt; class basic_expression : public any_expression
{
public:
    typedef T result_type;
    virtual T get_result() const = 0;

    virtual type_info const&amp; get_result_type_info() const
    {
        return typeid(T);
    }

    virtual boost::shared_ptr&lt;any_result_wrapper&gt; get_any_result() const
    {
        boost::shared_ptr&lt;basic_result_wrapper&lt;T&gt; &gt; w(new basic_result_wrapper(get_result()));
        return w;
    }
};
</code></pre>
<p>Allerdings ... rein intuitiv ... ich hab so das Gefühl als ob du das alles garnicht brauchst.<br />
Vielleicht könntest du mit einer Variant-Klasse arbeiten?<br />
boost::any wäre eine Möglichkeit, oder auch gern was eigenes wenn weder boost::any noch boost::variant noch sonstige fertige Lösungen passen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1464021</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1464021</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 27 Feb 2008 13:45:34 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Methodentemplates? on Wed, 27 Feb 2008 16:02:48 GMT]]></title><description><![CDATA[<p>Ist alles nicht so ganz das was ich mir vorstelle, aber trotzdem danke fuer die Muehe - boost::variant werd ich mir mal anschauen. Wenn ich das Problem behoben hab (oder eben doch ein Template nutze), werd ich mal berichten. (Oder ich warte auf C++0x mit <code>auto</code> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /> )</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1464156</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1464156</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 27 Feb 2008 16:02:48 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Methodentemplates? on Wed, 27 Feb 2008 17:15:38 GMT]]></title><description><![CDATA[<p>Was soll dir auto bringen?<br />
Ich vermute du erhoffst dir von auto was was es nicht ist, auto ist nämlich genauso statisch, und hilft dir hier nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1464217</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1464217</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 27 Feb 2008 17:15:38 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Methodentemplates? on Wed, 27 Feb 2008 17:30:59 GMT]]></title><description><![CDATA[<p>jein. Ein kleines Beispiel sollte es deutlich machen:</p>
<pre><code class="language-cpp">int a, b;
double d, e;

???? e = (expr(a) + b) &lt; (expr(d) * e);
</code></pre>
<p>Das Ergebnis des Ausdrucks rechts vom = ist vom Typ<br />
less_expr&lt;add_expr&lt;int,int&gt;, mult_expr&lt;double,double&gt; &gt; und hat den typdef result_type bool und eine Methode bool evaluate(); Es wäre jetzt Schwachsinn zu erwarten, dass ein Klient an stelle der ???? einen beliebig komplizierten Typ hinschreibt, deshalb wollte ich eine Klasse schrieben, deren Ctor alle möglichen expressions akzeptieren soll und das Monstrum in einer Holder-Klasse schachtelt. Mit auto wäre das nichtmehr möglich, wenn ich den Artikel im magazin richtig verstanden hab, da schrieb ich keine holderklasse sondern einfach auto e = .....</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1464235</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1464235</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 27 Feb 2008 17:30:59 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Methodentemplates? on Wed, 27 Feb 2008 18:48:17 GMT]]></title><description><![CDATA[<p>Ok.<br />
Wenns dir nur darum geht, das kannst du auch ohne auto zumindest soweit vereinfachen dass der client nurmehr schreiben muss:</p>
<pre><code class="language-cpp">int a, b;
double d, e;

expression_holder&lt;bool&gt; e = (expr(a) + b) &lt; (expr(d) * e);
</code></pre>
<p>Was in den meisten Fällen schon ausreichend sein sollte.<br />
Und zu implementieren ist das auch trivialst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1464285</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1464285</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 27 Feb 2008 18:48:17 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle Methodentemplates? on Wed, 27 Feb 2008 18:59:10 GMT]]></title><description><![CDATA[<p>ajo klar, wollte halt nur gucken obs da ne Möglichkeit ganz ohne tmpl gibt...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1464292</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1464292</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 27 Feb 2008 18:59:10 GMT</pubDate></item></channel></rss>