<?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[Prüfen, ob Typ den Erwartungen entspricht (Template)]]></title><description><![CDATA[<p>Hi</p>
<p>Nachdem ein Programmierer einen Typ als Templateargument angegeben hat, muss ich checken, ob der Typ den Zuweisungsoperator an sich selbst hat, ob der Typ die sechs Vergleichsoperatoren zu sich selbst hat und ob er acht der zehn arithmetischen Operatoren hat (kein Modulo benötigt).</p>
<p>Wie soll ich das machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/280460/prüfen-ob-typ-den-erwartungen-entspricht-template</link><generator>RSS for Node</generator><lastBuildDate>Mon, 24 Aug 2026 03:07:13 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/280460.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 16 Jan 2011 07:32:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Prüfen, ob Typ den Erwartungen entspricht (Template) on Sun, 16 Jan 2011 07:32:20 GMT]]></title><description><![CDATA[<p>Hi</p>
<p>Nachdem ein Programmierer einen Typ als Templateargument angegeben hat, muss ich checken, ob der Typ den Zuweisungsoperator an sich selbst hat, ob der Typ die sechs Vergleichsoperatoren zu sich selbst hat und ob er acht der zehn arithmetischen Operatoren hat (kein Modulo benötigt).</p>
<p>Wie soll ich das machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2007136</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2007136</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Sun, 16 Jan 2011 07:32:20 GMT</pubDate></item><item><title><![CDATA[Reply to Prüfen, ob Typ den Erwartungen entspricht (Template) on Sun, 16 Jan 2011 08:12:17 GMT]]></title><description><![CDATA[<p>Der compiler macht das.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2007144</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2007144</guid><dc:creator><![CDATA[90.000 Schafe]]></dc:creator><pubDate>Sun, 16 Jan 2011 08:12:17 GMT</pubDate></item><item><title><![CDATA[Reply to Prüfen, ob Typ den Erwartungen entspricht (Template) on Sun, 16 Jan 2011 08:20:25 GMT]]></title><description><![CDATA[<p>Das wäre die Lösung, wenn ich es verbieten will. Ich will aber eine Information, ob es verfügbar ist...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2007145</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2007145</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Sun, 16 Jan 2011 08:20:25 GMT</pubDate></item><item><title><![CDATA[Reply to Prüfen, ob Typ den Erwartungen entspricht (Template) on Sun, 16 Jan 2011 08:24:51 GMT]]></title><description><![CDATA[<p>EOutOfResources schrieb:</p>
<blockquote>
<p>Hi<br />
Nachdem ein Programmierer einen Typ als Templateargument angegeben hat,</p>
</blockquote>
<p>für ein Klassentemplate oder für ein Funktionstemplate?</p>
<p>EOutOfResources schrieb:</p>
<blockquote>
<p>Hi<br />
muss ich checken, ob der Typ den Zuweisungsoperator an sich selbst hat, ob der Typ die sechs Vergleichsoperatoren zu sich selbst hat und ob er acht der zehn arithmetischen Operatoren hat (kein Modulo benötigt).</p>
</blockquote>
<p>Warum <em>musst</em> Du das machen?</p>
<p>EOutOfResources schrieb:</p>
<blockquote>
<p>Hi<br />
Wie soll ich das machen?</p>
</blockquote>
<p>kommt drauf an, was Du damit genau erreichen willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2007146</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2007146</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sun, 16 Jan 2011 08:24:51 GMT</pubDate></item><item><title><![CDATA[Reply to Prüfen, ob Typ den Erwartungen entspricht (Template) on Sun, 16 Jan 2011 08:30:34 GMT]]></title><description><![CDATA[<p>Ich habe ein Klassentemplate.</p>
<p>Müssen tu ich es nicht. Eigentlich wollte ich &quot;will&quot; schreiben aber das hat zu arrogant getönt...</p>
<p>Das bei einem fehlerhaften Templateargument der Code trotzdem kompilierbar bleibt, indem man die Elementfunktionen, welche nichtvorhandene Operatoren des Datentypes nutzen wollen nicht vonhanden sind...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2007149</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2007149</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Sun, 16 Jan 2011 08:30:34 GMT</pubDate></item><item><title><![CDATA[Reply to Prüfen, ob Typ den Erwartungen entspricht (Template) on Sun, 16 Jan 2011 09:25:13 GMT]]></title><description><![CDATA[<p>Du meinst sowas?</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
class Calculator
{
public:
  T Plus(const T&amp; l, const T&amp; r) const
  {
    WENN_T_HAT_+_OPERATOR
    { 
      return l+r;
    }
    SONST
    {
      jaWasWillsteDennDannMachen();
      return SoTunAlsObNixWär();
    }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2007163</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2007163</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Sun, 16 Jan 2011 09:25:13 GMT</pubDate></item><item><title><![CDATA[Reply to Prüfen, ob Typ den Erwartungen entspricht (Template) on Sun, 16 Jan 2011 09:58:09 GMT]]></title><description><![CDATA[<p>EOutOfResources schrieb:</p>
<blockquote>
<p>Ich habe ein Klassentemplate.</p>
<p>Müssen tu ich es nicht. Eigentlich wollte ich &quot;will&quot; schreiben aber das hat zu arrogant getönt...</p>
</blockquote>
<p>Warum willst Du es denn machen? Ich verstehe immer noch nicht, was Du damit erreichen willst. Kannst Du das Problem, was Du gelöst haben willst, näher erklären?</p>
<p>EOutOfResources schrieb:</p>
<blockquote>
<p>Das bei einem fehlerhaften Templateargument der Code trotzdem kompilierbar bleibt, indem man die Elementfunktionen, welche nichtvorhandene Operatoren des Datentypes nutzen wollen nicht vonhanden sind...</p>
</blockquote>
<p>Diesen Satz verstehe ich nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2007172</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2007172</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sun, 16 Jan 2011 09:58:09 GMT</pubDate></item><item><title><![CDATA[Reply to Prüfen, ob Typ den Erwartungen entspricht (Template) on Sun, 16 Jan 2011 11:31:08 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">struct Typ_ohne_Operatoren
{
};
template&lt;class T&gt;
class Mathematik
{
public:
  T Addieren(T Summand1, T Summand2)
  {
    return Summand1 + Summand2;
  };
};

int main()
{
  Mathematik&lt;Typ_ohne_Operatoren&gt; math;
};
</code></pre>
<p>Das geht ja nicht. De Compiler meldet einem einen Fehler. Kann man den Code compilierbar machen, indem man die Ausführung der Elementfunktion namens &quot;Addieren&quot; untersagt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2007215</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2007215</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Sun, 16 Jan 2011 11:31:08 GMT</pubDate></item><item><title><![CDATA[Reply to Prüfen, ob Typ den Erwartungen entspricht (Template) on Sun, 16 Jan 2011 11:48:44 GMT]]></title><description><![CDATA[<p>Wie wäre es mit Traits. Als Standardparameter dient eine Klasse, die an die vorhandenen Operatoren delegiert. Für Klassen die keinen +Operator definieren braucht man eine Traits-Klasse, die sagt wie man stattdessen addiert.</p>
<p>Edit: noch ein Bsp hinterher</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
class MathTraits
{
public:
    static T Addieren(const T&amp;l, const T&amp; r)
    {
        return l + r;
    }
};

template&lt;typename T, typename Traits = MathTraits&lt;T&gt; &gt;
class Math
{
public:
    T Addieren(const T&amp;l, const T&amp; r) const
    {
        return Traits::Addieren(l, r);
    }
};

template&lt;typename T&gt;
class VectorTraits
{
public:
    typedef std::vector&lt;T&gt; Vector;
    static Vector Addieren(Vector l, const Vector&amp; r)
    {
        l.insert(l.end(), r.begin(), r.end());
        return l;
    }
};

int main()
{
    using namespace std;

    Math&lt;std::string&gt; m;
    cout &lt;&lt; m.Addieren(&quot;hallo &quot;, &quot;welt&quot;);

    Math&lt;std::vector&lt;int&gt;, VectorTraits&lt;int&gt; &gt; mv;
    std::vector&lt;int&gt; v1(3, 1) , v2(3, 2);
    std::vector&lt;int&gt; v3 = mv.Addieren(v1, v2);
    std::copy(v3.begin(), v3.end(), ostream_iterator&lt;int&gt;(cout));

    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2007220</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2007220</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Sun, 16 Jan 2011 11:48:44 GMT</pubDate></item><item><title><![CDATA[Reply to Prüfen, ob Typ den Erwartungen entspricht (Template) on Sun, 16 Jan 2011 11:55:13 GMT]]></title><description><![CDATA[<p>Wenn du die Funktion Addieren nur dann existieren lassen willst, wenn der Operator '+' vorhanden ist, musst du wohl entweder die Templates überladen oder zu SFINAE greifen (was aber nicht unbedingt die &quot;schöne&quot; und kurze Lösung ist). Bei SFINAE könnte ich dir ein Beispiel zeigen, wenn du das willst, bei Template-Überladung gehe ich davon aus, dass dir das bekannt ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2007223</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2007223</guid><dc:creator><![CDATA[wxSkip]]></dc:creator><pubDate>Sun, 16 Jan 2011 11:55:13 GMT</pubDate></item><item><title><![CDATA[Reply to Prüfen, ob Typ den Erwartungen entspricht (Template) on Sun, 16 Jan 2011 12:18:18 GMT]]></title><description><![CDATA[<p>EOutOfResources schrieb:</p>
<blockquote>
<p>Das geht ja nicht.</p>
</blockquote>
<p>Doch, das geht sehr wohl. Solange man <code>Addieren()</code> nicht aufruft, ist alles in Ordnung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2007228</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2007228</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 16 Jan 2011 12:18:18 GMT</pubDate></item><item><title><![CDATA[Reply to Prüfen, ob Typ den Erwartungen entspricht (Template) on Sun, 16 Jan 2011 20:09:04 GMT]]></title><description><![CDATA[<p>Durch SFINAE könnte man also höchstens die Compilermeldung verbessern, z.B. etwa</p>
<blockquote>
<p>class Foo does not contain any function called &quot;Addition&quot;</p>
</blockquote>
<p>statt</p>
<blockquote>
<p>In function Foo::Addieren(T First, T second) with T=[non_addable]:<br />
no matching function for call to operator+()<br />
note: candidates are:<br />
note: int operator+(int, int)</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2007438</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2007438</guid><dc:creator><![CDATA[wxSkip]]></dc:creator><pubDate>Sun, 16 Jan 2011 20:09:04 GMT</pubDate></item><item><title><![CDATA[Reply to Prüfen, ob Typ den Erwartungen entspricht (Template) on Mon, 17 Jan 2011 10:49:00 GMT]]></title><description><![CDATA[<p>wxSkip schrieb:</p>
<blockquote>
<p>Wenn du die Funktion Addieren nur dann existieren lassen willst, wenn der Operator '+' vorhanden ist, musst du wohl entweder die Templates überladen oder zu SFINAE greifen</p>
</blockquote>
<p>Nein. Wie Nexus gesagt hat einfach Addieren() so definieren wie es laufen soll, wenn der op+ vorhanden ist. Wenn das Templateargument keinen op+ hat, läuft der Code trotzdem, solange Addieren() nicht aufgerufen wird.<br />
Grund: Addieren() ist als Memberfunktion eines Klassentemplates ein Funktionstemplate und wird nur dann instantiiert wenn sie aufgerufen (bzw. erwähnt) wird. Wird sie nicht aufgerufen, dann wird das Template auch nicht instantiiert und der Compiler stolpert auch nicht über den fehlenden op+</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2007623</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2007623</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 17 Jan 2011 10:49:00 GMT</pubDate></item></channel></rss>