<?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[templatestruktur erzwingen?]]></title><description><![CDATA[<p>gibt es eine saubere möglichkeit bei templates zu erzwingen, dass die templateklasse bestimmte eigenschaften mitbringt bzw eine bestimmte basisklasse hat?</p>
<p>also zum beispiel, dass wenn ich ein template array habe</p>
<pre><code class="language-cpp">template &lt;class t&gt;
class my_array
{
//hier wird auf funktionalität von my_base zugegriffen
//und t soll als basisklasse my_base haben, kann aber durchaus noch mehr mitbringen
};
</code></pre>
<p>das dann die templateklasse t als basisklasse</p>
<pre><code class="language-cpp">class my_base
{
//verschiedne funktionalitäten
};
</code></pre>
<p>hat um sicherzustellen, dass ich auf die elemente in dem array bestimmte funktionalitäten anwenden kann.</p>
<p>ich weiß, dass ich einfach davon ausgehen kann, dass die funktionalität zur verfügung steht, und dann ein fehler kommt, falls dem nicht so ist. allerdings finde ich diese variante nicht sehr gut und wollte wissen ob man das irgendwie erzwingen kann. ich hoffe es ist verständlich worauf ich hinaus will, vielen dank schon mal im voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/182776/templatestruktur-erzwingen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 23 Sep 2026 01:44:26 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/182776.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 29 May 2007 09:21:38 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to templatestruktur erzwingen? on Tue, 29 May 2007 09:21:38 GMT]]></title><description><![CDATA[<p>gibt es eine saubere möglichkeit bei templates zu erzwingen, dass die templateklasse bestimmte eigenschaften mitbringt bzw eine bestimmte basisklasse hat?</p>
<p>also zum beispiel, dass wenn ich ein template array habe</p>
<pre><code class="language-cpp">template &lt;class t&gt;
class my_array
{
//hier wird auf funktionalität von my_base zugegriffen
//und t soll als basisklasse my_base haben, kann aber durchaus noch mehr mitbringen
};
</code></pre>
<p>das dann die templateklasse t als basisklasse</p>
<pre><code class="language-cpp">class my_base
{
//verschiedne funktionalitäten
};
</code></pre>
<p>hat um sicherzustellen, dass ich auf die elemente in dem array bestimmte funktionalitäten anwenden kann.</p>
<p>ich weiß, dass ich einfach davon ausgehen kann, dass die funktionalität zur verfügung steht, und dann ein fehler kommt, falls dem nicht so ist. allerdings finde ich diese variante nicht sehr gut und wollte wissen ob man das irgendwie erzwingen kann. ich hoffe es ist verständlich worauf ich hinaus will, vielen dank schon mal im voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1294282</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1294282</guid><dc:creator><![CDATA[StarCraftFeuerteufel]]></dc:creator><pubDate>Tue, 29 May 2007 09:21:38 GMT</pubDate></item><item><title><![CDATA[Reply to templatestruktur erzwingen? on Tue, 29 May 2007 09:33:12 GMT]]></title><description><![CDATA[<p>Wenn du dich auf deine Klassenhierarchie verlassen willst, solltest du die Templates vergessen und mit my_base-Zeigern oder Referenzen arbeiten (Stichwort: Polymorphie).</p>
<p>Ansonsten geh einfach davon aus, daß der Template-Parameter alle benötigten Funktionen mitbringt - der Compiler wird sich schon beschweren, wenn er etwas nicht findet (ja ich weiß, solche Meldungen enden mitunter in langen &quot;instantiated from here&quot;-Listen). Damit bist du letzten Endes flexibler.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1294298</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1294298</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 29 May 2007 09:33:12 GMT</pubDate></item><item><title><![CDATA[Reply to templatestruktur erzwingen? on Tue, 29 May 2007 10:50:14 GMT]]></title><description><![CDATA[<p>Hallo habe mal das hier gefunden. Vielleicht kann mir das jemand erklären. Oder funktioniert das nur Zufällig obzw. undefiniert?<br />
Hab schon mal soviel Kommentare wie mir möglich war eingefügt.</p>
<pre><code class="language-cpp">template &lt;class Derived, class Base&gt; //Parameter sind klar
class Check
{
class Nope {}; // eine leere Klasse
class Yep {char Dummy[3];}; // eine leere Klasse mit sizeof (Yep) == 3
static Yep Test(Base*); // ????
static Nope Test(...); // ????
public:
enum {
IsDerived = sizeof(Test(static_cast&lt;Derived*&gt;(0))) // ????
== sizeof(Yep)
};
};
class X {};
class Y : public X {};

int main()
{
cout &lt;&lt; Check&lt;Y, X&gt;::IsDerived &lt;&lt; endl;

cout &lt;&lt; Check&lt;int, string&gt;::IsDerived &lt;&lt; endl;
return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1294340</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1294340</guid><dc:creator><![CDATA[templäd]]></dc:creator><pubDate>Tue, 29 May 2007 10:50:14 GMT</pubDate></item><item><title><![CDATA[Reply to templatestruktur erzwingen? on Tue, 29 May 2007 11:03:55 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">template &lt;class Derived, class Base&gt; //Parameter sind klar
class Check
{
class Nope {}; // eine leere Klasse
class Yep {char Dummy[3];}; // eine leere Klasse mit sizeof (Yep) == 3
static Yep Test(Base*); // Test übernimmt alle Objekte vom Typ Base oder die vom Typ Base abgeleitet sind, Rückgabewert ist Yep
static Nope Test(...); // Übernimmt den ganzen Rest, Rückgabewert = Nope
public:
enum {
IsDerived = sizeof(Test(static_cast&lt;Derived*&gt;(0))) 
== sizeof(Yep) // Testet ob die Größe des Rückgabewerts von Test gleich der der Klasse Yep ist. (
Sollte egtl keine 0 gecastet werden sondern ein Objekt vom Typ Derived nach Typ Base)
};
};
class X {};
class Y : public X {};

int main()
{
cout &lt;&lt; Check&lt;Y, X&gt;::IsDerived &lt;&lt; endl;

cout &lt;&lt; Check&lt;int, string&gt;::IsDerived &lt;&lt; endl;
return 0;
}
</code></pre>
<p>Diese Idee wurde u.A. in &quot;Mondern C++ Design&quot; Vorgestellt:</p>
<pre><code class="language-cpp">template&lt; typename T, typename U &gt;
struct conversion
{
	typedef char small;
	struct big { char dummy[ 2 ]; };
	static big test( ... );
	static small test( U );
	static T make_t();

	enum { exists = sizeof( small ) == sizeof( test( make_t() ) ) };
};

class foo
{};

class bar : public foo
{};

int main()
{
	std::cout &lt;&lt; conversion&lt; bar, foo &gt;::exists;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1294346</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1294346</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Tue, 29 May 2007 11:03:55 GMT</pubDate></item><item><title><![CDATA[Reply to templatestruktur erzwingen? on Tue, 29 May 2007 12:23:56 GMT]]></title><description><![CDATA[<p>also das mit dieser strukur conversion versteh ich nicht so richtig. das mit der polymorphie kann ich ja mal versuchen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1294422</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1294422</guid><dc:creator><![CDATA[StarCraftFeuerteufel]]></dc:creator><pubDate>Tue, 29 May 2007 12:23:56 GMT</pubDate></item><item><title><![CDATA[Reply to templatestruktur erzwingen? on Tue, 29 May 2007 22:22:15 GMT]]></title><description><![CDATA[<p>muss ich bei der polymorphie einfach jedes templateargument, also die templateklasse t, durch my_base ersetzen?<br />
also statt</p>
<pre><code class="language-cpp">template &lt;class t&gt;
class my_array
{
  t data;
//...
}
</code></pre>
<p>jetzt</p>
<pre><code class="language-cpp">class my_array
{
  my_base data;
//...
}
</code></pre>
<p>oder wie??? wenn ich jetzt aber eine von my_base abgeleitete klasse habe und die 'data' zuweise dann bleibt doch nur noch das zeugs aus my_base übrig, oder? also die abgeleitete klasse wird doch dann quasi auf my_base heruntergeschraubt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1294873</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1294873</guid><dc:creator><![CDATA[StarCraftFeuerteufel]]></dc:creator><pubDate>Tue, 29 May 2007 22:22:15 GMT</pubDate></item><item><title><![CDATA[Reply to templatestruktur erzwingen? on Wed, 30 May 2007 17:05:39 GMT]]></title><description><![CDATA[<p>Wieso nicht einfach implizit auf by_base* konvertieren?</p>
<pre><code class="language-cpp">class my_base
{
public:
    virtual void foo(int i) = 0;
    // ...
};

template &lt;class T&gt; class bar
{
public:
    void baz(T* t)
    {
        my_base* mb = t; // hier krachts (natürlich beim compilieren schon!) beim
                         // spezialisieren wenn die konvertierung nicht möglich/erlaubt ist
        mb-&gt;foo(123);
    }
};
</code></pre>
<p>Oder aber man verwendet &quot;duck typing&quot; und verlangt nicht dass von my_base geerbt wird, sondern bloss dass die Funktion &quot;foo&quot; (mit einer passenden Signatur) vorhanden ist. Was eigentlich die üblichere weil meist sinnvollere Variante ist:</p>
<pre><code class="language-cpp">template &lt;class T&gt; class bar
{
public:
    void baz(T* t)
    {
        t-&gt;foo(123);
    }
};
</code></pre>
<p>EDIT: *PEINLICH* ... hatte die Funktion im Template &quot;bar&quot; auch &quot;bar&quot; genannt, was natürlich nicht geht *pfeiff*. Hab's korrigiert. *pfeiff*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1294897</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1294897</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 30 May 2007 17:05:39 GMT</pubDate></item><item><title><![CDATA[Reply to templatestruktur erzwingen? on Wed, 30 May 2007 07:39:39 GMT]]></title><description><![CDATA[<p>nagut wenn das die übliche weise ist, dann werde ich das auch so machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1294962</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1294962</guid><dc:creator><![CDATA[StarCraftFeuerteufel]]></dc:creator><pubDate>Wed, 30 May 2007 07:39:39 GMT</pubDate></item><item><title><![CDATA[Reply to templatestruktur erzwingen? on Wed, 30 May 2007 07:50:20 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>es entspricht eben der klassischen C++-Strategie: Nur das festlegen, was man wirklich braucht !<br />
Und das ist hier eben die Schnittstelle (=benötigte Member) - ob sie die von irgendwo geerbt haben, ist da eigentlich nicht wichtig.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1294966</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1294966</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Wed, 30 May 2007 07:50:20 GMT</pubDate></item></channel></rss>