<?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[template &amp;lt;class T : pulbic BaseClass&amp;gt; ... wie funktioniert das richtig?]]></title><description><![CDATA[<p>Hi, ich möchte eine Template Funktion schreiben, die als Template Argument eine Klasse nimmt, die von einer bestimmen Basis Klassen erben <em>muss</em>.<br />
Wie macht man das richtig. Ich habe diese schreibweise einfach mal intuitiv gewählt:</p>
<pre><code>class Camera
{
    /* ... */
    virtual void Move() = 0;
};

class MyCam : public Camera
{
    /* ... */
    void Move();
};

template &lt;class T : public Camera&gt; T* CreateCamera() // !!!
{
    T* Cam = new T();
    Cam-&gt;Move();
    return Cam;
}

MyCam* c = CreateCamera&lt;MyCam&gt;();
</code></pre>
<p>Wie funktioniert das richtig?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/293356/template-lt-class-t-pulbic-baseclass-gt-wie-funktioniert-das-richtig</link><generator>RSS for Node</generator><lastBuildDate>Sun, 16 Aug 2026 09:58:40 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/293356.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 01 Oct 2011 11:36:16 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to template &amp;lt;class T : pulbic BaseClass&amp;gt; ... wie funktioniert das richtig? on Sat, 01 Oct 2011 11:36:16 GMT]]></title><description><![CDATA[<p>Hi, ich möchte eine Template Funktion schreiben, die als Template Argument eine Klasse nimmt, die von einer bestimmen Basis Klassen erben <em>muss</em>.<br />
Wie macht man das richtig. Ich habe diese schreibweise einfach mal intuitiv gewählt:</p>
<pre><code>class Camera
{
    /* ... */
    virtual void Move() = 0;
};

class MyCam : public Camera
{
    /* ... */
    void Move();
};

template &lt;class T : public Camera&gt; T* CreateCamera() // !!!
{
    T* Cam = new T();
    Cam-&gt;Move();
    return Cam;
}

MyCam* c = CreateCamera&lt;MyCam&gt;();
</code></pre>
<p>Wie funktioniert das richtig?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2125800</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2125800</guid><dc:creator><![CDATA[LukasBanana]]></dc:creator><pubDate>Sat, 01 Oct 2011 11:36:16 GMT</pubDate></item><item><title><![CDATA[Reply to template &amp;lt;class T : pulbic BaseClass&amp;gt; ... wie funktioniert das richtig? on Sat, 01 Oct 2011 11:48:32 GMT]]></title><description><![CDATA[<p>Hallo LukasBanana,</p>
<p>du brauchst/kannst in C++ den Template-Parametern keine Typinformationen mitgeben.</p>
<pre><code class="language-cpp">template &lt;class T&gt;
T* CreateCamera(){
    T* Cam = new T();
    Cam-&gt;Move();
    return Cam;
}
</code></pre>
<p>EDIT: Also wenn sie die Bedingungen nicht erfüllt, kriegst du halt einen Kompilierfehler...</p>
<p>EDIT2: Jetzt kannst du natürlich auch mit 'Nicht-Camera'-Typen, die einen Default-Konstruktor und eine Funktion Move() haben, die Funktion aufrufen.<br />
Falls du das wirklich verhindern willst - worin ich atm keinen Sinn sehe - kannst du etwas machen wie:</p>
<pre><code class="language-cpp">void check_if_cam(Camera&amp; cam){}

template &lt;class T&gt;
T* CreateCamera(){
    T* Cam = new T();
    check_if_cam(*Cam);
    Cam-&gt;Move();
    return Cam;
}
</code></pre>
<p>Gruß,<br />
XSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2125801</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2125801</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Sat, 01 Oct 2011 11:48:32 GMT</pubDate></item><item><title><![CDATA[Reply to template &amp;lt;class T : pulbic BaseClass&amp;gt; ... wie funktioniert das richtig? on Sat, 01 Oct 2011 12:21:17 GMT]]></title><description><![CDATA[<p>Alles klar danke, dann lass ich die Überprüfung (check_if_camera) einfach weg.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2125810</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2125810</guid><dc:creator><![CDATA[LukasBanana]]></dc:creator><pubDate>Sat, 01 Oct 2011 12:21:17 GMT</pubDate></item><item><title><![CDATA[Reply to template &amp;lt;class T : pulbic BaseClass&amp;gt; ... wie funktioniert das richtig? on Sat, 01 Oct 2011 13:27:41 GMT]]></title><description><![CDATA[<p>LukasBanana schrieb:</p>
<blockquote>
<p>Hi, ich möchte eine Template Funktion schreiben</p>
</blockquote>
<p>Funktions-Template heißt das. Es ist keine Funktion. Es ist ein Template. Eine Schablone für Funktionen. Funktions-Template.</p>
<p>LukasBanana schrieb:</p>
<blockquote>
<p>, die als Template Argument eine Klasse nimmt, die von einer bestimmen Basis Klassen erben <em>muss</em>.</p>
</blockquote>
<p>Wo äußert sich das mit dem &quot;muss&quot;?</p>
<p>LukasBanana schrieb:</p>
<blockquote>
<p>Wie macht man das richtig. Ich habe diese schreibweise einfach mal intuitiv gewählt:</p>
<pre><code>class Camera
{
    /* ... */
    virtual void Move() = 0;
};

class MyCam : public Camera
{
    /* ... */
    void Move();
};

template &lt;class T : public Camera&gt; T* CreateCamera() // !!!
{
    T* Cam = new T();
    Cam-&gt;Move();
    return Cam;
}

MyCam* c = CreateCamera&lt;MyCam&gt;();
</code></pre>
<p>Wie funktioniert das richtig?</p>
</blockquote>
<p>Wenn T kein Move() anbietet, dann kompiliert das so einfach nicht und gut ist. Man kann Funktions-Templates mit Tricks &quot;beschränken&quot;. Ich sehe in Deinem Fall aber nicht den Nutzen.</p>
<p>Mal ein Beispiel:</p>
<pre><code>template&lt;class T&gt;
class stupid_pointer {
  T* ptr_;
public:
  stupid_pointer(T* p) : ptr_(p) {}

  T* get() const {return ptr_;}

  template&lt;class U&gt;
  stupid_pointer(stupid_pointer&lt;U&gt; p
    [b],typename boost::enable_if&lt;[/b]
      [b]boost::is_convertible&lt;U*,T*&gt;[/b]
    [b]&gt;::type* =0[/b]
  ) : ptr_(p.get()) {}

  T* operator-&gt;() const {return p;}
  T&amp; operator*() const {return *p;}
};
</code></pre>
<p>Sinvoll ist das aus zwei Gründen:<br />
- Fehler früher abfangen<br />
- Überladungsmenge klein halten</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2125834</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2125834</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sat, 01 Oct 2011 13:27:41 GMT</pubDate></item></channel></rss>