<?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[[Gelöst] Probleme beim automatischen Erschließen des Template-Typen]]></title><description><![CDATA[<p>Hallo,</p>
<p>beim Lesen eines Papers von Stroustrup über C++0x habe ich mal ein wenig mit Constraints herumprobiert und sein Beispiel 'find_if' aufgegriffen. Dafür habe ich mir zwei Constraint-Klassen geschrieben, die u.a. auch testen sollen, ob 'Pred' (siehe Code) eine Funktion ist, die ein 'T' akzeptiert und ein 'bool' zurückgibt. Daher meine Funktion '_find_if':</p>
<pre><code class="language-cpp">template &lt;class T, class It, class Pred&gt;
It _find_if(It first, It last, Pred p)
{
    Constraint_ForwardIterator&lt;It, T&gt;();
    Constraint_Predicate&lt;Pred, T&gt;();
    while (first != last &amp;&amp; !p(*first)) ++first;
    return first;
}
</code></pre>
<p>(Der Code der Constraints ist für mein Problem unwichtig.)</p>
<p>Leider kompiliert dieser Code nicht, VC++ 2005 moniert: &quot;'It _find_if(It,It,Pred)' : could not deduce template argument for 'T'.&quot; Ist ja auch irgendwie logisch, denn 'T' wird nirgendwo verwendet. Also habe ich folgende Zeile eingefügt, um dem Compiler einen Hinweis zu geben, welchen Typ T hat:</p>
<pre><code class="language-cpp">template &lt;class T, class It, class Pred&gt;
It _find_if(It first, It last, Pred p)
{
    Constraint_ForwardIterator&lt;It, T&gt;();
    Constraint_Predicate&lt;Pred, T&gt;();
    T x = *first; // *
    while (first != last &amp;&amp; !p(*first)) ++first;
    return first;
}
</code></pre>
<p>Meiner Meinung nach müsste das jetzt funktionieren -- leider hat der Compiler eine andere Meinung und gibt den selben Fehler aus. Liegt das am Compiler oder ist es laut Standard tatsächlich nicht notwendig, dass der Compiler den Typ hier allein herausfindet? Im Prinzip müsste das doch gehen, indem der Compiler sich den Rückgabetyp von 'It::operator*()' (oder 'operator*(It)') anschaut, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/154206/gelöst-probleme-beim-automatischen-erschließen-des-template-typen</link><generator>RSS for Node</generator><lastBuildDate>Mon, 07 Sep 2026 22:42:58 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/154206.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 25 Jul 2006 12:00:16 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [Gelöst] Probleme beim automatischen Erschließen des Template-Typen on Tue, 25 Jul 2006 12:24:36 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>beim Lesen eines Papers von Stroustrup über C++0x habe ich mal ein wenig mit Constraints herumprobiert und sein Beispiel 'find_if' aufgegriffen. Dafür habe ich mir zwei Constraint-Klassen geschrieben, die u.a. auch testen sollen, ob 'Pred' (siehe Code) eine Funktion ist, die ein 'T' akzeptiert und ein 'bool' zurückgibt. Daher meine Funktion '_find_if':</p>
<pre><code class="language-cpp">template &lt;class T, class It, class Pred&gt;
It _find_if(It first, It last, Pred p)
{
    Constraint_ForwardIterator&lt;It, T&gt;();
    Constraint_Predicate&lt;Pred, T&gt;();
    while (first != last &amp;&amp; !p(*first)) ++first;
    return first;
}
</code></pre>
<p>(Der Code der Constraints ist für mein Problem unwichtig.)</p>
<p>Leider kompiliert dieser Code nicht, VC++ 2005 moniert: &quot;'It _find_if(It,It,Pred)' : could not deduce template argument for 'T'.&quot; Ist ja auch irgendwie logisch, denn 'T' wird nirgendwo verwendet. Also habe ich folgende Zeile eingefügt, um dem Compiler einen Hinweis zu geben, welchen Typ T hat:</p>
<pre><code class="language-cpp">template &lt;class T, class It, class Pred&gt;
It _find_if(It first, It last, Pred p)
{
    Constraint_ForwardIterator&lt;It, T&gt;();
    Constraint_Predicate&lt;Pred, T&gt;();
    T x = *first; // *
    while (first != last &amp;&amp; !p(*first)) ++first;
    return first;
}
</code></pre>
<p>Meiner Meinung nach müsste das jetzt funktionieren -- leider hat der Compiler eine andere Meinung und gibt den selben Fehler aus. Liegt das am Compiler oder ist es laut Standard tatsächlich nicht notwendig, dass der Compiler den Typ hier allein herausfindet? Im Prinzip müsste das doch gehen, indem der Compiler sich den Rückgabetyp von 'It::operator*()' (oder 'operator*(It)') anschaut, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1103759</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1103759</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Tue, 25 Jul 2006 12:24:36 GMT</pubDate></item><item><title><![CDATA[Reply to [Gelöst] Probleme beim automatischen Erschließen des Template-Typen on Tue, 25 Jul 2006 12:13:29 GMT]]></title><description><![CDATA[<p>Tut er aber nicht. Der Compiler schaut sich um Template-Argumente herauszufinden nur die Parameter an. Du musst ihn also entweder explizit angeben oder du benutzt das typedef value_type aus den iterator_traits.</p>
<p>/edit: also:</p>
<pre><code class="language-cpp">template &lt;class It, class Pred&gt;
It _find_if(It first, It last, Pred p)
{
    typedef typename std::iterator_traits&lt;It&gt;::value_type T;
    Constraint_ForwardIterator&lt;It, T&gt;();
    Constraint_Predicate&lt;Pred, T&gt;();
    while (first != last &amp;&amp; !p(*first)) ++first;
    return first;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1103775</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1103775</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Tue, 25 Jul 2006 12:13:29 GMT</pubDate></item><item><title><![CDATA[Reply to [Gelöst] Probleme beim automatischen Erschließen des Template-Typen on Tue, 25 Jul 2006 12:25:07 GMT]]></title><description><![CDATA[<p>.filmor schrieb:</p>
<blockquote>
<p>Tut er aber nicht.</p>
</blockquote>
<p>Schade.</p>
<p>Mit Iterator-Traits funktioniert es natürlich. Interessant ist aber, dass in VC 2005 die Fehlermeldung bei falschen Typen durch die Constraints nicht leserlicher wird -- was zum Großteil daran liegt, dass sie auch ohne Constraints schon sehr leserlich ist.</p>
<p>EDIT: Danke natürlich für die Antwort.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1103786</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1103786</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Tue, 25 Jul 2006 12:25:07 GMT</pubDate></item><item><title><![CDATA[Reply to [Gelöst] Probleme beim automatischen Erschließen des Template-Typen on Tue, 25 Jul 2006 12:35:37 GMT]]></title><description><![CDATA[<p>Sind Constraints das gleiche wie Concept-Checking?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1103804</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1103804</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Tue, 25 Jul 2006 12:35:37 GMT</pubDate></item><item><title><![CDATA[Reply to [Gelöst] Probleme beim automatischen Erschließen des Template-Typen on Tue, 25 Jul 2006 12:48:49 GMT]]></title><description><![CDATA[<p>.filmor schrieb:</p>
<blockquote>
<p>Sind Constraints das gleiche wie Concept-Checking?</p>
</blockquote>
<p>Na ja, &quot;das gleiche&quot; ... Konzepte funktionieren in C++ zur Zeit ja noch nicht. Insofern sind die Constraints ein Workaround, das zur Compilezeit bestimmte Bedingungen für die Typen überprüft -- im Prinzip genauso wie ein Konzept. Ich vergleiche sowas immer am liebsten mit Typenklassen in Haskell, mit dem Unterschied, dass die Haskell-Typenklassen zusätzlich noch einen sehr mächtigen Mechanismus bereitstellen, der einem das Methodenschreiben abnimmt.</p>
<p>Meine Constraints in dem Beispiel sehen aber im Prinzip genauso aus wie Stroustrups:</p>
<pre><code class="language-cpp">template &lt;class I, class T&gt; struct Constraint_ForwardIterator {
    static void constraints(I a, T c) { ++a; a++; I b = a; b = a; *b = *a; c = *a; }
    Constraint_ForwardIterator() { void (*f)(I, T) = constraints; }
};

template &lt;class P, class T&gt; struct Constraint_Predicate {
    static void constraints(P p, T a) { bool x = p(a); }
    Constraint_Predicate() { void (*f)(P, T) = constraints; }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1103819</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1103819</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Tue, 25 Jul 2006 12:48:49 GMT</pubDate></item><item><title><![CDATA[Reply to [Gelöst] Probleme beim automatischen Erschließen des Template-Typen on Tue, 25 Jul 2006 12:58:48 GMT]]></title><description><![CDATA[<p>Konrad Rudolph schrieb:</p>
<blockquote>
<p>Na ja, &quot;das gleiche&quot; ... Konzepte funktionieren in C++ zur Zeit ja noch nicht.</p>
</blockquote>
<p><a href="http://www.boost.org/libs/concept_check/concept_check.htm" rel="nofollow">Wohl</a> ;), und zwar genauso, wie es bei C++ eigentlich immer gefordert wird: Nicht als Sprachfeature, sondern in Form einer Bibliothek.<br />
Ist wohl doch dasselbe wie Constraints, aber die Boost-Lib erspart einem einen Teil der Arbeit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1103828</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1103828</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Tue, 25 Jul 2006 12:58:48 GMT</pubDate></item><item><title><![CDATA[Reply to [Gelöst] Probleme beim automatischen Erschließen des Template-Typen on Tue, 25 Jul 2006 13:32:30 GMT]]></title><description><![CDATA[<p>.filmor schrieb:</p>
<blockquote>
<p>Konrad Rudolph schrieb:</p>
<blockquote>
<p>Na ja, &quot;das gleiche&quot; ... Konzepte funktionieren in C++ zur Zeit ja noch nicht.</p>
</blockquote>
<p><a href="http://www.boost.org/libs/concept_check/concept_check.htm" rel="nofollow">Wohl</a> ;), und zwar genauso, wie es bei C++ eigentlich immer gefordert wird: Nicht als Sprachfeature, sondern in Form einer Bibliothek.<br />
Ist wohl doch dasselbe wie Constraints, aber die Boost-Lib erspart einem einen Teil der Arbeit.</p>
</blockquote>
<p>Na ja, also in C++0x wird das doch die Form eines Sprachfeatures haben. Natürlich gibt es noch nichts genaues aber z.B. kursiert folgende Syntax (<a href="http://www.research.att.com/~bs/DnE2005.pdf" rel="nofollow">http://www.research.att.com/~bs/DnE2005.pdf</a>):</p>
<pre><code class="language-cpp">template &lt;typename T&gt; concept Predicate {
    Predicate p;
    T x;
    bool b = p(x);
};

// ...

template &lt;Container C, Predicate&lt;C::value_type&gt; Pred&gt;
bool all(C c, Pred p) {
    for(auto i = c.begin(); i != c.end(); ++i)
        if (!*i) return false;
    return true;
}
</code></pre>
<p>Neu ist hier natürlich des Schlüsselworts 'concept' und die Template-Deklaration mit eingebauter Überprüfung.</p>
<p>Wobei ich persönlich (na, ich zähle ja nicht) diese Form der Überprüfung komisch finde. Ich fände es sozusagen als &quot;abstrakte Basisklasse&quot; logischer:</p>
<pre><code class="language-cpp">template &lt;typename T&gt; concept Predicate {
    bool operator ()(T const&amp;);
};
</code></pre>
<p>Natürlich ist der Begriff des Konzepts an sich nicht neu, SGI z.B. verwendet ihn durchgängig in seiner Dokumentation der STL-Implementierung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1103867</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1103867</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Tue, 25 Jul 2006 13:32:30 GMT</pubDate></item></channel></rss>