<?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[Compiletime Schnittstellen]]></title><description><![CDATA[<p>Hallo Leute!</p>
<p>Ich hab mir eben Gedanken darüber gemacht, dass es doch eigentlich praktisch wäre, wenn man in C++ eine Möglichkeit hätte, Compiletime-Schnittstellen definieren zu können. Also Klassendefinitionen, die keine Polymorphie modellieren, sondern nur sicherstellen, dass eine Klasse, die man davon ableitet Schnittstellen-kompatibel mit einer gewissen Definition ist (alle deren public-Symbole anbietet), so dass einem bei verschiedenen Implementierungen derselben Sache geholfen wird, kompatibel zu bleiben. Das wär natürlich praktisch für templates (aber da ist ja schon was im Gange mit den Constraints?) und für Cross-Plattform oder Cross-API Biblitheken. Könnte man die angedachten Constraints auch irgendwie dafür nutzen?</p>
<p>Viele Grüße,<br />
Deci</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/311474/compiletime-schnittstellen</link><generator>RSS for Node</generator><lastBuildDate>Mon, 03 Aug 2026 14:16:25 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/311474.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 06 Dec 2012 11:43:22 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Compiletime Schnittstellen on Thu, 06 Dec 2012 11:43:22 GMT]]></title><description><![CDATA[<p>Hallo Leute!</p>
<p>Ich hab mir eben Gedanken darüber gemacht, dass es doch eigentlich praktisch wäre, wenn man in C++ eine Möglichkeit hätte, Compiletime-Schnittstellen definieren zu können. Also Klassendefinitionen, die keine Polymorphie modellieren, sondern nur sicherstellen, dass eine Klasse, die man davon ableitet Schnittstellen-kompatibel mit einer gewissen Definition ist (alle deren public-Symbole anbietet), so dass einem bei verschiedenen Implementierungen derselben Sache geholfen wird, kompatibel zu bleiben. Das wär natürlich praktisch für templates (aber da ist ja schon was im Gange mit den Constraints?) und für Cross-Plattform oder Cross-API Biblitheken. Könnte man die angedachten Constraints auch irgendwie dafür nutzen?</p>
<p>Viele Grüße,<br />
Deci</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2277729</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2277729</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 06 Dec 2012 11:43:22 GMT</pubDate></item><item><title><![CDATA[Reply to Compiletime Schnittstellen on Thu, 06 Dec 2012 11:57:32 GMT]]></title><description><![CDATA[<p>Macht zwar sicher nicht alles was du möchtest, aber schreib bei den ableitenden Klassen &quot;overwrite&quot; hinter die Funktionen und du bekommst nen Compileerror, wenn die Schnittstellen nicht zueinander passen.</p>
<p>greetz KN4CK3R</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2277734</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2277734</guid><dc:creator><![CDATA[KN4CK3R]]></dc:creator><pubDate>Thu, 06 Dec 2012 11:57:32 GMT</pubDate></item><item><title><![CDATA[Reply to Compiletime Schnittstellen on Thu, 06 Dec 2012 12:37:14 GMT]]></title><description><![CDATA[<p>Meinst du sowas wie Concepts?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2277746</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2277746</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Thu, 06 Dec 2012 12:37:14 GMT</pubDate></item><item><title><![CDATA[Reply to Compiletime Schnittstellen on Thu, 06 Dec 2012 12:39:47 GMT]]></title><description><![CDATA[<p>Er will so etwas wie pimpl nur ohne pimpl.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2277747</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2277747</guid><dc:creator><![CDATA[pimpler]]></dc:creator><pubDate>Thu, 06 Dec 2012 12:39:47 GMT</pubDate></item><item><title><![CDATA[Reply to Compiletime Schnittstellen on Thu, 06 Dec 2012 12:59:41 GMT]]></title><description><![CDATA[<p>Argh, wo ich in meinem Posting Contraint geschrieben habe, meinte ich natürlich Concept.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2277757</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2277757</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 06 Dec 2012 12:59:41 GMT</pubDate></item><item><title><![CDATA[Reply to Compiletime Schnittstellen on Thu, 06 Dec 2012 13:06:06 GMT]]></title><description><![CDATA[<p>Hier mal Pseudocode</p>
<pre><code class="language-cpp">static_interface some_interface {
   int a( bool b );
   void c( float d);
};

class impl1 : some_interface {
   int a( bool b );
   void c( float d);
};

class impl2 : some_interface {
};   // whoah, kompiliert nicht, weil impl2 nicht drop-in-kompatibel zu some_interface ist!
</code></pre>
<p>Also eigentlich soll soetwas wie typedef-kompatibilität gesichert werden. Wo immer impl1 verwendet wird, könnte per typedef auch impl2 verwendet werden und der Compiler warnt den Entwickler, wenn er gegen die Kompatibilität verstößt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2277760</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2277760</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 06 Dec 2012 13:06:06 GMT</pubDate></item><item><title><![CDATA[Reply to Compiletime Schnittstellen on Thu, 06 Dec 2012 13:06:42 GMT]]></title><description><![CDATA[<p>pure virtual functions?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2277761</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2277761</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 06 Dec 2012 13:06:42 GMT</pubDate></item><item><title><![CDATA[Reply to Compiletime Schnittstellen on Thu, 06 Dec 2012 13:10:56 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19375">@SeppJ</a> Prinzipiell soetwas in der Art, aber die Checks ganze soll zur Compile-Zeit ablaufen, weil die Typen bekannt sind. Also anderes Beispiel: Das C++ Standardkommitee gibt für die komplette STL so eine static_interface-Beschreibung raus und alle STL-Implementierer leiten ihre Implementierungen davon ab und der Compiler würde sie daran erinnern, wenn sie irgendwas vergessen. Mag jetzt ein schlechtes Beispiel sein <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2277764</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2277764</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 06 Dec 2012 13:10:56 GMT</pubDate></item><item><title><![CDATA[Reply to Compiletime Schnittstellen on Thu, 06 Dec 2012 13:28:15 GMT]]></title><description><![CDATA[<p>Also suchst du doch Concepts: <a href="http://www.boost.org/libs/concept_check/" rel="nofollow">http://www.boost.org/libs/concept_check/</a></p>
<pre><code class="language-cpp">template &lt;typename T&gt;
bool static_interface()
{
  T t; // Defaultkonstruktor                                                             
  int a = t.a((bool)true); (void)a; // int a(bool)                                       
  t.c((float)0);  // void c(float)                                                       
  return true;
}
bool _i_m_p_l_1_ = static_interface&lt;impl1&gt;(); // ok
bool _i_m_p_l_2_ = static_interface&lt;impl2&gt;(); // Fehler
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2277773</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2277773</guid><dc:creator><![CDATA[AWERMGFAIWRM]]></dc:creator><pubDate>Thu, 06 Dec 2012 13:28:15 GMT</pubDate></item><item><title><![CDATA[Reply to Compiletime Schnittstellen on Thu, 06 Dec 2012 13:34:51 GMT]]></title><description><![CDATA[<p>Ja, so einen Test könnte man so &quot;emulieren&quot; (Im Prinzip ist das ja ein &quot;Full-Interface-Coverage&quot;-Clientcode), aber wäre es nicht toll, wenn die Sprache das einfach so unterstützt? Bei Concepts war ich mir nicht sicher, ob die nur im Kontext von template-Argumenten funktionieren, oder ob man die auch für nicht-Template-Klassen verwenden kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2277777</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2277777</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 06 Dec 2012 13:34:51 GMT</pubDate></item><item><title><![CDATA[Reply to Compiletime Schnittstellen on Thu, 06 Dec 2012 13:41:29 GMT]]></title><description><![CDATA[<p>Du meinst, so?</p>
<p><a href="http://en.wikipedia.org/wiki/Concepts_%28C++0x%29" rel="nofollow">http://en.wikipedia.org/wiki/Concepts_(C++0x)</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2277779</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2277779</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Thu, 06 Dec 2012 13:41:29 GMT</pubDate></item><item><title><![CDATA[Reply to Compiletime Schnittstellen on Thu, 06 Dec 2012 14:12:43 GMT]]></title><description><![CDATA[<p>Nunja, halt doch nicht ganz so irgendwie, wenn ich die concepts richtig verstehe.<br />
Ich dem Fall der c++-concepts ist es ja der Client-Code eines Typs, der Anforderungen an diesen Typ stellt, außerdem allem ist dieser Client-Code selber ein template.<br />
Ich als Bibliotheken-Schreiber möchte aber überprüft haben, dass mein Code ein bestimmtes concept einhält. Wenn ich das richtig verstehe, was ich über concepts gelesen habe, dann muss ich mir immer noch einen extra-Client schreiben, der für mich überprüft, ob ich das concept wirklich eingehalten habe. Ich möchte aber schon beim Implementieren per Konvention dieses concept einhalten (so dass der Typ gar nicht erst vom Compiler akzeptiert wird, wenn er das concept nicht erfüllt). So ein Konstrukt sehe ich da im Moment noch nicht (wobei meine Augen auch nicht mehr die besten sind!).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2277792</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2277792</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 06 Dec 2012 14:12:43 GMT</pubDate></item><item><title><![CDATA[Reply to Compiletime Schnittstellen on Thu, 06 Dec 2012 14:18:47 GMT]]></title><description><![CDATA[<p>Das schöne an Concepts ist eben, dass sie auf mehrere Arten gelten. Für den, der die Funktion aufruft, für den, der sie schreibt und für den, der den Typ bereitstellt. Du suchst <a href="http://en.wikipedia.org/wiki/Concepts_%28C++0x%29#Concept_maps" rel="nofollow">Concept maps</a> (in deinem Fall <code>concept_map static_interface&lt;impl1&gt; {};</code> . Von Boost wird das imho auch abgedeckt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2277796</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2277796</guid><dc:creator><![CDATA[konzeptor]]></dc:creator><pubDate>Thu, 06 Dec 2012 14:18:47 GMT</pubDate></item><item><title><![CDATA[Reply to Compiletime Schnittstellen on Thu, 06 Dec 2012 14:33:46 GMT]]></title><description><![CDATA[<p>Also würde das das folgende bedeuten für meinen pseudo-Code?</p>
<pre><code class="language-cpp">concept some_interface&lt;T&gt; {    // T unnötig?
   int a( bool b );
   void c( float d);
};

class impl1 {
   int a( bool b );
   void c( float d);
};

concept_map some_interface&lt;impl1&gt; {}  // OK

class impl2 {
};   

concept_map some_interface&lt;impl2&gt; {} // Nicht OK
</code></pre>
<p>Irgendwie erscheint mir das geistig &quot;quer&quot; (weil die Interface-Garantie nicht teil der Implementierung ist), da verstehe ich etwas noch nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2277798</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2277798</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 06 Dec 2012 14:33:46 GMT</pubDate></item><item><title><![CDATA[Reply to Compiletime Schnittstellen on Thu, 06 Dec 2012 15:57:21 GMT]]></title><description><![CDATA[<p>Ja, du willst Concepts haben. Und nach dem letzten Stand des Sprachfeatures, also, bevor es wieder rausflog, hätte man das in deinem Fall so aufschreiben müssen:</p>
<pre><code class="language-cpp">concept some_interface&lt;typename T&gt;
{
  int T::a(bool);
  void T::c(float);  
}
</code></pre>
<p>Das Bekloppte daran ist nur, dass diese Constraints wie Funktionsdeklarationen aussehen, aber in Wirklichkeit für Ausdrücke stehen, die &quot;funktionieren müssen&quot;, wenn T wirklich ein some_interface ist. Also, man muss in diesem fall eine Methode a aufrufen können, wo man ein bool reinstecken kann (auch wenn es z.b. implizit zu etwas anderes konvertiert wird) und etwas zurück gibt, was man wieder nach int konvertieren kann.</p>
<p>In dem Concepts-Design war es aber nicht vorgesehen, dass man explizit sagen kann, dass eine Klasse einem Konzept entsprechen soll und daraufhin überprüft werden soll. Ich sehe auch nicht den Vorteil. Da wo Concepts dann wirklich zum Tragen kommen, sind die requires-Klauseln gewesen, mit denen du dann &quot;modular type checking&quot; bekommt. Die Templates können daraufhin auf ihre &quot;Korrektheit&quot; überprüft werden, bevor sie überhaupt instantiiert. Und der Anwender eines solchen Templates bekommt auch eine Fehlermeldung, wenn er bestimmte Bedingungen nicht erfüllt. Man kann also die Schuld jemandem zuweisen, dem Template-Autor oder dem Template-Nutzer.</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
  requires some_interface&lt;T&gt;
void foo(T &amp; obj)
{
  obj.a(23);
  obj.c(3.14f);
}
</code></pre>
<p>Abkürzungs-Syntax:</p>
<pre><code class="language-cpp">template&lt;some_interface T&gt;
void foo(T &amp; obj)
{
  obj.a(23);
  obj.c(3.14f);
}
</code></pre>
<p>Die Constraints beschränkten sich auch nicht auf Elementfunktionen, sondern umfassten auch &quot;assoziierte Typen&quot; sowie freie Funktionen. Beispiel:</p>
<pre><code class="language-cpp">concept Swappable&lt;typename T&gt;
{
  void swap(T&amp;,T&amp;);
}
</code></pre>
<p>oder auch</p>
<pre><code class="language-cpp">concept PointerLike&lt;typename T&gt;
  : DefaultConstrucbible&lt;T&gt;
  , MoveConstructible&lt;T&gt;
  , MoveAssignable&lt;T&gt;
{
  typename reference_type;   // assoziierter Typ

  reference_type operator*(T);    // Dereferenzierung
}
</code></pre>
<p>Und Concepts beschränkten sich auch nicht auf einen Parameter. Man konnte darin z.B. auch Beziehungen zwischen mehreren Typen ausdrücken:</p>
<pre><code class="language-cpp">concept Assignable&lt;T,U&gt;
{
  T&amp; T::operator=(U);
}
</code></pre>
<p>Ich bin mal gespannt, was das noch gibt. Bin aber auch froh, dass das wieder aus dem C++0x Entwurf rausgeflogen ist. Das haben ja nichtmal 3% des Kommittees verstanden. Ich habe das 2-3 Jahre lang verfolgt, die Papers gelesen und versucht zu verstehen. Was für ein komplizierter Scheiß das war ... Es hat auch nicht besonders toll mit dem einen oder anderen C++11-Feature interagiert -- z.B. mit Rvalue-Referenzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2277826</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2277826</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 06 Dec 2012 15:57:21 GMT</pubDate></item><item><title><![CDATA[Reply to Compiletime Schnittstellen on Thu, 06 Dec 2012 16:20:41 GMT]]></title><description><![CDATA[<p>Decimad schrieb:</p>
<blockquote>
<p>Irgendwie erscheint mir das geistig &quot;quer&quot; (weil die Interface-Garantie nicht teil der Implementierung ist), da verstehe ich etwas noch nicht.</p>
</blockquote>
<p>Muss sie das explizit angeben? Ich finde dieses Compile-Time-Duck-Typing gar nicht schlecht. Zumindest muss es &quot;auto-Konzepte&quot; geben. Keiner will an jeden Typen extra dranschreiben müssen, dass er kopierbar, zuweisbar, default-konstruirbar ist u.s.w. Das verrät einem die Schnittstelle ja schon. &quot;auto concepts&quot; sind dann solche, die sich automatisch auf alles übertragen, was &quot;strukturell&quot; passt. Im vorherigen Posting hätte ich z.b. mindestens bei bei Swappable und Assignable ein &quot;auto&quot; davor setzen müssen, weil ich nicht für jeden Typen extra per concept_map sagen will, dass man ein swap aufrufen kann oder eine Zuweisung durchführen kann. Das ergibt sich ja schon aus der Schnittstelle.</p>
<p>Man unterscheidet da zwischen Bedingungen, die rein &quot;strukturell&quot; sind und semantischen Bedingungen. Wenn ich ein swap für ein T aufrufen kann, dann reicht mir das. Das ist der strukturelle Teil. Der semantische Teil eines solchen Constraints würde dann sagen &quot;wenn man dieses swap ausführt, wird auch tatsächlich der Inhalt/die Werte der beiden Objekte getauscht&quot;. Das lässt sich nicht in Code aufschreiben und deswegen gab es auch die Möglichkeit Konzepte so zu definieren, dass man doch explizit sagen muss, welche Typen alle dieses Konzept modellieren.</p>
<p>Ein Haken bei der ganzen Concepts-Geschichte war, dass man viel zu viel Code schreiben musste. Ich will kein &quot;modular typechecking&quot; haben, wenn ich dafür viel viel mehr Code schreiben muss.</p>
<p>Ach, eins, was Concepts ermöglichen sollte, was wir aber noch nicht genannt haben, war &quot;concept-based overloading&quot;, also:</p>
<pre><code class="language-cpp">template&lt;ForwardIterator Iter&gt;
void advance(Iter &amp; iter, Iter::difference_type step)
{
  assert(step&gt;=0);
  while (step&gt;0) {
    ++iter;
    --step;
  }
}

template&lt;BidirectionalIterator Iter&gt;
void advance(Iter &amp; iter, Iter::difference_type step)
{
  while (step&gt;0) {
    ++iter;
    --step;
  }
  while (step&lt;0) {
    --iter;
    ++step;
  }
}

template&lt;RandomAccessIterator Iter&gt;
void advance(Iter &amp; iter, Iter::difference_type step)
{
  iter += step;
}
</code></pre>
<p>Das macht man im Moment per &quot;tag dispatching&quot;, aber dieses concept-based overloading wär natürlich ein netter Ersatz dafür.</p>
<p>Also alles in allem ... die Ziele von Concepts waren hoch gesteckt. Kurzfassung: Ein Typsystem für Typen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2277838</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2277838</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 06 Dec 2012 16:20:41 GMT</pubDate></item></channel></rss>