<?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[Concepts in der Praxis]]></title><description><![CDATA[<p>Hey,<br />
ich habe mich in letzter Zeit etwas mit den C++17-Concepts beschäftigt. Dabei kam mir die Überlegung, wie Concepts es ermöglichen wollen, die Templateargumente auf Kompatibilität von in der Funktion benutzten Templatevariablen zu überprüfen?<br />
Also z. B.:</p>
<pre><code>template &lt;typename T&gt;
concept bool C = requires (T a, int b)
{
    { a.func(b) } -&gt; void; 
};

struct A
{
    void func(int b) { UNUSED(b); }
    int a{0};
};

void doSomething(C param)
{
    std::map&lt;decltype(param), decltype(param)&gt; map;
    param.func(5);
    map.insert(std::make_pair(param, param));
}

int main()
{
    doSomething(A{});     
}
</code></pre>
<p>Bei diesem Beispiel hat man wieder das Problem, dass std::map einen &lt;-Operator verlangt.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/334243/concepts-in-der-praxis</link><generator>RSS for Node</generator><lastBuildDate>Sat, 25 Apr 2026 22:18:25 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/334243.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 31 Aug 2015 12:24:07 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Concepts in der Praxis on Mon, 31 Aug 2015 12:24:07 GMT]]></title><description><![CDATA[<p>Hey,<br />
ich habe mich in letzter Zeit etwas mit den C++17-Concepts beschäftigt. Dabei kam mir die Überlegung, wie Concepts es ermöglichen wollen, die Templateargumente auf Kompatibilität von in der Funktion benutzten Templatevariablen zu überprüfen?<br />
Also z. B.:</p>
<pre><code>template &lt;typename T&gt;
concept bool C = requires (T a, int b)
{
    { a.func(b) } -&gt; void; 
};

struct A
{
    void func(int b) { UNUSED(b); }
    int a{0};
};

void doSomething(C param)
{
    std::map&lt;decltype(param), decltype(param)&gt; map;
    param.func(5);
    map.insert(std::make_pair(param, param));
}

int main()
{
    doSomething(A{});     
}
</code></pre>
<p>Bei diesem Beispiel hat man wieder das Problem, dass std::map einen &lt;-Operator verlangt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2466335</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2466335</guid><dc:creator><![CDATA[Mr.L]]></dc:creator><pubDate>Mon, 31 Aug 2015 12:24:07 GMT</pubDate></item><item><title><![CDATA[Reply to Concepts in der Praxis on Mon, 31 Aug 2015 13:39:49 GMT]]></title><description><![CDATA[<p>Ich sehe es als Defizit von C++, wenn bei Funktionsaufrufe Errors in Code auftauchen können, den ich selber nicht implementiert habe. Und wenn ich bei Concepts Funktionen beachten müsste, welche in meiner Funktion aufgerufen werden, würde das doch die Concepts ziemlich aufblähen und es würde zu Problemen führen wenn in Funktionsaufrufen in meiner Funktion irgendwelche zusätzlichen Abhängigkeiten hinzu kämen (wenn wir das obigere Bsp. nehmen und z.B. in der insert-Funktion von std::map plötzlich noch der &gt;-Operator verlangt werden würde) oder nicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2466341</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2466341</guid><dc:creator><![CDATA[Mr.L]]></dc:creator><pubDate>Mon, 31 Aug 2015 13:39:49 GMT</pubDate></item><item><title><![CDATA[Reply to Concepts in der Praxis on Mon, 31 Aug 2015 14:43:22 GMT]]></title><description><![CDATA[<p>Ab einem gewissen Punkt wird LWG auch <code>map</code> mit einigen Contraints versehen. Dann kannst du mittels eines type contraints überprüfen, ob die Spezialisierung <code>std::map&lt;a, b&gt;</code> auch gültig ist (wobei ein type constraint IIRC die Spezialisierung per se nicht instantiiert, man müsste also auf e.g. einen Member zugreifen).</p>
<p>Edit: Zu deinem zweiten Post: Wenn du für eine Funktion eine Reihe von constraints angeben willst, dann doch nur, um sie zu überladen? Dann sollten das aber relativ wenige sein, da du nur zu einem bestimmten Maße einschränkend sein willst. Sehr genaue Details brauchst du nicht zu überprüfen, sie würden Overload resolution nicht behilflich sein. E.g. für dein Beispiel einfach <code>requires LessThanComparable&lt;decltype(param)&gt;</code> angeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2466346</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2466346</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Mon, 31 Aug 2015 14:43:22 GMT</pubDate></item><item><title><![CDATA[Reply to Concepts in der Praxis on Mon, 31 Aug 2015 15:31:53 GMT]]></title><description><![CDATA[<p>Aufpassen:<br />
T in map muss nicht LessThanComparable sein wenn man einen compare-Functor mit angibt.</p>
<p>Man muss bei Concepts sehr aufpassen, dass man nicht zu viel einschränkt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2466352</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2466352</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Mon, 31 Aug 2015 15:31:53 GMT</pubDate></item><item><title><![CDATA[Reply to Concepts in der Praxis on Mon, 31 Aug 2015 15:38:46 GMT]]></title><description><![CDATA[<p>Das muss überhaupt nicht LessThanComparable sein. Die Standardvergleichsfunktion ist doch <code>std::less</code> . Die Vergleichsfunktion muss ein Konzept erfüllen, nicht das Element: <code>Compare(std::declval&lt;T&gt;(), std::declval&lt;T&gt;())</code> muss &quot;convertible to bool&quot; oder so sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2466356</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2466356</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Mon, 31 Aug 2015 15:38:46 GMT</pubDate></item><item><title><![CDATA[Reply to Concepts in der Praxis on Mon, 31 Aug 2015 19:58:52 GMT]]></title><description><![CDATA[<p>Erstmal danke an alle.</p>
<p>Arcoth schrieb:</p>
<blockquote>
<p>Ab einem gewissen Punkt wird LWG auch <code>map</code> mit einigen Contraints versehen. Dann kannst du mittels eines type contraints überprüfen, ob die Spezialisierung <code>std::map&lt;a, b&gt;</code> auch gültig ist</p>
</blockquote>
<p>Meinst du das Concept von std::map wiederverwenden?</p>
<p>Oder hast du mir da evtl. ein Beispiel?</p>
<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>Aufpassen:<br />
T in map muss nicht LessThanComparable sein wenn man einen compare-Functor mit angibt.</p>
<p>Man muss bei Concepts sehr aufpassen, dass man nicht zu viel einschränkt.</p>
</blockquote>
<p>Danke, wusste ich noch nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2466388</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2466388</guid><dc:creator><![CDATA[JulianH]]></dc:creator><pubDate>Mon, 31 Aug 2015 19:58:52 GMT</pubDate></item><item><title><![CDATA[Reply to Concepts in der Praxis on Mon, 31 Aug 2015 21:11:14 GMT]]></title><description><![CDATA[<p>TyRoXx schrieb:</p>
<blockquote>
<p>Das muss überhaupt nicht LessThanComparable sein.</p>
</blockquote>
<p>Doch?Ich entsinne mich von map&lt;decltype(param), decltype(param)&gt; gesprochen zu haben, nicht von irgendetwas allgemeinerem.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2466395</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2466395</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Mon, 31 Aug 2015 21:11:14 GMT</pubDate></item></channel></rss>