<?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[Dummy Knoten]]></title><description><![CDATA[<p>Hallo Leute.</p>
<p>Ich habe eine Datenstruktur die einen Dummy-Knoten als erstes Element hat. Ein Knoten sieht etwa so aus:</p>
<pre><code class="language-cpp">struct node {
		node* next;
		value_type value;

		node(value_type const&amp; value=value_type(), node* next=0)
		: value(value), next(next)
		{}
	};
</code></pre>
<p>das Problem hier ist offensichtlich: der dummy Knoten enthaelt ein vollstaendiges value_type objekt.</p>
<p>Was ist hier das standard vorgehen? empty_node (mit nur einem next* und kein value_type) als basisklasse von node (die dann value_type) hinzufuegt?</p>
<p>technisch kein Problem, da ich ja immer wenn ich value brauche casten kann und da ich weiss welcher knoten dummy ist und welcher nicht, brauche ich nichtmal nen virtuellen dtor.</p>
<p>aber ist das die standard variante oder gibt es etwas huebscheres ohne downcasts?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/219635/dummy-knoten</link><generator>RSS for Node</generator><lastBuildDate>Wed, 07 Oct 2026 04:55:24 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/219635.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 05 Aug 2008 18:23:56 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Dummy Knoten on Tue, 05 Aug 2008 18:23:56 GMT]]></title><description><![CDATA[<p>Hallo Leute.</p>
<p>Ich habe eine Datenstruktur die einen Dummy-Knoten als erstes Element hat. Ein Knoten sieht etwa so aus:</p>
<pre><code class="language-cpp">struct node {
		node* next;
		value_type value;

		node(value_type const&amp; value=value_type(), node* next=0)
		: value(value), next(next)
		{}
	};
</code></pre>
<p>das Problem hier ist offensichtlich: der dummy Knoten enthaelt ein vollstaendiges value_type objekt.</p>
<p>Was ist hier das standard vorgehen? empty_node (mit nur einem next* und kein value_type) als basisklasse von node (die dann value_type) hinzufuegt?</p>
<p>technisch kein Problem, da ich ja immer wenn ich value brauche casten kann und da ich weiss welcher knoten dummy ist und welcher nicht, brauche ich nichtmal nen virtuellen dtor.</p>
<p>aber ist das die standard variante oder gibt es etwas huebscheres ohne downcasts?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1559807</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1559807</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Tue, 05 Aug 2008 18:23:56 GMT</pubDate></item><item><title><![CDATA[Reply to Dummy Knoten on Tue, 05 Aug 2008 18:27:03 GMT]]></title><description><![CDATA[<p>Warum nicht einfach so:</p>
<pre><code class="language-cpp">Node {
  bool dummy;
  //rest
}

ValueNode {
  value_type value;
}
</code></pre>
<p>Kannst anhand des Flags leicht einsehen was ein dummy ist und entsprechend downcasten, Speicheroverhead hast kaum. Evt. kannst das Flag sogar weglassen, dann unterscheiden ist der Speicherunterschied wahrscheinlich 0, zu deiner jetzigen Variante.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1559808</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1559808</guid><dc:creator><![CDATA[Dummy-Boy]]></dc:creator><pubDate>Tue, 05 Aug 2008 18:27:03 GMT</pubDate></item><item><title><![CDATA[Reply to Dummy Knoten on Tue, 05 Aug 2008 18:29:08 GMT]]></title><description><![CDATA[<p>lies meinen post bitte. ich hoffe jemand hat etwas ernsthaftes zu sagen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1559811</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1559811</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Tue, 05 Aug 2008 18:29:08 GMT</pubDate></item><item><title><![CDATA[Reply to Dummy Knoten on Tue, 05 Aug 2008 18:31:53 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>lies meinen post bitte. ich hoffe jemand hat etwas ernsthaftes zu sagen...</p>
</blockquote>
<p>Das war ein &quot;ja mach es so&quot;. Wie willst du es denn sonst machen? Eben...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1559813</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1559813</guid><dc:creator><![CDATA[Dummy-Boy]]></dc:creator><pubDate>Tue, 05 Aug 2008 18:31:53 GMT</pubDate></item><item><title><![CDATA[Reply to Dummy Knoten on Tue, 05 Aug 2008 18:36:28 GMT]]></title><description><![CDATA[<p>Dummy-Boy schrieb:</p>
<blockquote>
<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>lies meinen post bitte. ich hoffe jemand hat etwas ernsthaftes zu sagen...</p>
</blockquote>
<p>Das war ein &quot;ja mach es so&quot;. Wie willst du es denn sonst machen? Eben...</p>
</blockquote>
<p>schau dir deinen post an, da steht schwachfug. (du hast keine beziehung zwischen den beiden klassen und der dummy bool ist sinnlos).</p>
<p>sorry, koennen wir bitte ein vernuenftiges niveau annehmen?<br />
danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1559817</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1559817</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Tue, 05 Aug 2008 18:36:28 GMT</pubDate></item><item><title><![CDATA[Reply to Dummy Knoten on Tue, 05 Aug 2008 18:38:44 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>Dummy-Boy schrieb:</p>
<blockquote>
<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>lies meinen post bitte. ich hoffe jemand hat etwas ernsthaftes zu sagen...</p>
</blockquote>
<p>Das war ein &quot;ja mach es so&quot;. Wie willst du es denn sonst machen? Eben...</p>
</blockquote>
<p>schau dir deinen post an, da steht schwachfug. (du hast keine beziehung zwischen den beiden klassen und der dummy bool ist sinnlos).</p>
<p>sorry, koennen wir bitte ein vernuenftiges niveau annehmen?<br />
danke.</p>
</blockquote>
<p>Das war ja auch kein fertiger Code, sondern nur schnell hingeschrieben, und ja die Vererbung habe ich vergessen.<br />
Wenn dich meine Postings so sehr stören, dann lösche sie doch einfach und fang sozusagen nochmals bei 0 an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1559820</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1559820</guid><dc:creator><![CDATA[Dummy-Boy]]></dc:creator><pubDate>Tue, 05 Aug 2008 18:38:44 GMT</pubDate></item><item><title><![CDATA[Reply to Dummy Knoten on Tue, 05 Aug 2008 18:52:58 GMT]]></title><description><![CDATA[<p>Hachja, die Menschen ... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /><br />
scnr, awaiting deletion...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1559828</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1559828</guid><dc:creator><![CDATA[Popoklopfer@ausgeloggt]]></dc:creator><pubDate>Tue, 05 Aug 2008 18:52:58 GMT</pubDate></item><item><title><![CDATA[Reply to Dummy Knoten on Tue, 05 Aug 2008 18:59:59 GMT]]></title><description><![CDATA[<p>Warum brauchst du überhaupt einen Dummy-Knoten als erstes Element? Es gibt doch kein prev. Warum hast du nicht einfach nur nen Pointer auf der erste Element um es zu erkennen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1559831</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1559831</guid><dc:creator><![CDATA[frage 2.7.1.9]]></dc:creator><pubDate>Tue, 05 Aug 2008 18:59:59 GMT</pubDate></item><item><title><![CDATA[Reply to Dummy Knoten on Tue, 05 Aug 2008 19:16:10 GMT]]></title><description><![CDATA[<p>frage 2.7.1.9 schrieb:</p>
<blockquote>
<p>Warum brauchst du überhaupt einen Dummy-Knoten als erstes Element? Es gibt doch kein prev. Warum hast du nicht einfach nur nen Pointer auf der erste Element um es zu erkennen?</p>
</blockquote>
<p>Hm, das ist eine gute Frage. Wenn du, Shade, sowieso immer weißt wann es sich um einen Dummy-Knoten handelt und wann nicht, warum brauchst du diese dann überhaupt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1559835</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1559835</guid><dc:creator><![CDATA[Nachdenklicher Leser]]></dc:creator><pubDate>Tue, 05 Aug 2008 19:16:10 GMT</pubDate></item><item><title><![CDATA[Reply to Dummy Knoten on Tue, 05 Aug 2008 20:56:04 GMT]]></title><description><![CDATA[<p>Nachdenklicher Leser schrieb:</p>
<blockquote>
<p>Hm, das ist eine gute Frage. Wenn du, Shade, sowieso immer weißt wann es sich um einen Dummy-Knoten handelt und wann nicht, warum brauchst du diese dann überhaupt?</p>
</blockquote>
<p>Das steht nicht zur debatte.<br />
es ist technisch die beste mir bekannte loesung hier mit einem dummy objekt zu arbeiten.</p>
<p>ich ueberlege die ganze zeit ob man da was mit makros und templates bauen kann dass die downcasts versteckt. die sehen naemlich so haesslich aus <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1559880</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1559880</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Tue, 05 Aug 2008 20:56:04 GMT</pubDate></item><item><title><![CDATA[Reply to Dummy Knoten on Tue, 05 Aug 2008 21:17:35 GMT]]></title><description><![CDATA[<p>ernst gemeinte frage: wieso ist der knoten dummy?</p>
<p>wenn du eine liste hast, was anscheinend der fall ist, bedeutet das, dass du einen knoten ohne inhalt hast, aber trotzdem eine instanz von value_type im knoten existiert. dafür gibt es keine lösung mit nur einer struktur.</p>
<p>ohne jeden kontext ist es aber schwer, eine antwort zu schreiben. du musst uns also wahrscheinlich mehr information geben, was genau du dann mit dem knoten machst und wieso er nötig ist.</p>
<p>und vielleicht beschimpfst du nicht leute, die dir helfen wollen. das sollte nicht die art eines moderators sein. (das sollte niemandes art sein...)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1559887</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1559887</guid><dc:creator><![CDATA[besserwisser]]></dc:creator><pubDate>Tue, 05 Aug 2008 21:17:35 GMT</pubDate></item><item><title><![CDATA[Reply to Dummy Knoten on Tue, 05 Aug 2008 21:27:36 GMT]]></title><description><![CDATA[<p>sorry, ich hatte erwartet dass vernuenftige antworten kommen...</p>
<p>der dummy knoten ist notwendig. punkt. aus. schluss.</p>
<p>dummy knoten sind generell etwas das oefters auftritt. das sollte eigentlich nicht verwundern.</p>
<p>die frage war eigentlich ganz simpel:<br />
gibt es eine moeglichkeit dummy knoten zu erstellen ohne dauernd downcasts noetig zu haben, bzw. diese downcasts zu verstecken?</p>
<p>einfache frage - schwere antwort, keine frage. aber bisher gab es nicht einen post der sinnvoll und on topic war... aber das hatte ich ehrlich gesagt nicht erwartet. es war mehr die leise hoffnung dass jemand das problem irgendwann mal eleganter geloest hatte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1559890</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1559890</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Tue, 05 Aug 2008 21:27:36 GMT</pubDate></item><item><title><![CDATA[Reply to Dummy Knoten on Tue, 05 Aug 2008 23:05:58 GMT]]></title><description><![CDATA[<p>Sollen die dummy-knoten denn unabhängig davon auftreten können, ob das element vll das letzte oder erste der liste/.... ist?</p>
<p>wenn nicht (und so fern du eine doppelt verkettete liste hast), könntest du ja einfach this-&gt;next auf this zeigen lassen oder das gleiche halt mir prev... aber is nat auch doof, wenn man jedes ma so was überprüfen muss...</p>
<p>also wie wärs mit so was?</p>
<p>{Müll (ab hier edit)}</p>
<p>omg - hab ich ma wieder nur die hälfte gelesen... sry... Vll geht es ja so (kein Plan, aber wenn ich eh scho mist geschrieben hab, warum dann nicht gleich bissl mehr? ^^):</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

struct node_base_base
 {
  node_base_base *next;

  node_base_base (node_base_base *_next) : next (_next) {}

  virtual ~node_base_base () {}
 };

template &lt;bool is_dummy&gt;
 struct node_base : node_base_base
  {
   bool IsDummy () const {return is_dummy;}

   node_base (node_base_base *_next) : node_base_base (_next) {}

   virtual ~node_base () {}
  };

template &lt;class T, bool IsDummy = true&gt; //dummy
 struct node : node_base &lt;IsDummy&gt;
  {
   node (node_base_base *_next) : node_base (_next) {}

   virtual ~node () {}
  };

 template &lt;class T&gt;
  struct node &lt;T, false&gt; : node_base &lt;false&gt;
  {
   T value;

   node (const T &amp;_value, node_base *_next = NULL) : value (_value), node_base (_next) {}

   virtual ~node () {}
  };
</code></pre>
<pre><code class="language-cpp">int main ()
{
node &lt;int&gt; * first_element (0);
for (node_base_base *a (first_element); a != 0; a = a-&gt;next)
  {
    if (!static_cast &lt;node &lt;int&gt; *&gt; (a)-&gt;IsDummy ())
      std::cout &lt;&lt; static_cast &lt;node &lt;int, false&gt; *&gt; (a)-&gt;value &lt;&lt; std::endl;
  }
}
</code></pre>
<p>naja - ist vll nicht die allerschönste Lösung, aber</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1559897</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1559897</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Tue, 05 Aug 2008 23:05:58 GMT</pubDate></item><item><title><![CDATA[Reply to Dummy Knoten on Tue, 05 Aug 2008 21:55:49 GMT]]></title><description><![CDATA[<p>Ich halte die Fragen/Antworten zum Teil für durchaus vernünftig. Nach dem was du in der Fragestellung offenbarst besteht ein Dummyknoten bisher bei dir nur aus einem nicht genutzten value_type und einem Pointer auf einen Knoten, die frage warum du statt des Dummys also nicht nur einen simplen Pointer verwendest ist also berechtigt, denn für die Leser hier ist nicht ersichtlich, warum du den zusätzlichen Speicherverbrauch und die zusätzliche Indirektion nicht einfach sparst - dafür mag es Gründe geben, allerdings musst du zugeben dass die den Lesern nicht offensichtlich sind. Und &quot;steht nicht zur Debatte&quot; oder &quot;beste mir bekannte Lösung&quot; oder &quot;punkt.aus.schluss&quot; sind keine gültgen Gründe für eine Designentscheidung.<br />
Du verlangst offenbar Antworten, die etwas berücksichtigen was du offenbar nicht preisgeben willst. Unter solchen Umständen kann dir keiner wirklich helfen.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/26836">@topic</a>:<br />
bei kleinen value_types fällt die extra Speicherbelegung nicht ins Gewicht, und wenn du nur wenige (oder einen) der dummy-nodes brauchst würd ichs einfach sein lassen mir darüber gedanken zu machen - vorausgesetzt der value_type hat einen default-Ctor. Bei großen value_types lohnt es evtl statt einer direkten Speicherung der Werte auch dafür pointer zu verwenden. der dummy-node hat dann halt einen null-pointer.<br />
Den overhead bei den dummies ganz zu vermeiden geht nicht, du müsstest wohl verschiedene node-klassen haben die auf das jeweils nächste Element gleichartig zugreifen können. Polymorphie und virtuelle zugriffsfunktionen fürs nächste Element wären die Konsequenz, damit handelst du dir aber erstens für jedes Objket die Speicherkosten für einen vptr ein sowie bei jedem entlanghangeln die zusätzliche Indirektion über den vptr, soviel zum Thema overhead vermeiden.</p>
<p>Da du allerdings schreibst dass der dummy-node nur als erstes auftritt, wird das einfachste und effektivste eben doch sein, bei Bedarf zu casten oder den Zugriff über den ternäen operator zu regeln. Wenn du ganz fancy werden willst könntest du eventuell irgendwie die short-cirquit-operatoren einsetzen die in den meisten Fällen zünden und eben nur beim Spezialfall in den alternativen Ausführungszweig gehen.</p>
<p>Nach dem was du oben geschrieben hast handelt es sich aber nur um Schönheits-OPs (zugegeben, casts sind nicht besonders attraktiv, aber manchmal eben nötig), und es scheint fraglich, ob es sich lohnt, da Zeit und Hirnschmalz reinzustecken - da was zu optimieren bringt vermutlich so wenig Zeit dass die Datenstruktur schon sehr extrem angestrengt werden müsste um den Aufwand bei der Programmierung aufzuwiegen <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/1559899</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1559899</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 05 Aug 2008 21:55:49 GMT</pubDate></item><item><title><![CDATA[Reply to Dummy Knoten on Wed, 06 Aug 2008 06:09:43 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>sorry, ich hatte erwartet dass vernuenftige antworten kommen...</p>
<p>der dummy knoten ist notwendig. punkt. aus. schluss.</p>
<p>dummy knoten sind generell etwas das oefters auftritt. das sollte eigentlich nicht verwundern.</p>
<p>die frage war eigentlich ganz simpel:<br />
gibt es eine moeglichkeit dummy knoten zu erstellen ohne dauernd downcasts noetig zu haben, bzw. diese downcasts zu verstecken?</p>
<p>einfache frage - schwere antwort, keine frage. aber bisher gab es nicht einen post der sinnvoll und on topic war... aber das hatte ich ehrlich gesagt nicht erwartet. es war mehr die leise hoffnung dass jemand das problem irgendwann mal eleganter geloest hatte.</p>
</blockquote>
<p>Nichts für ungut, aber mit den bestehenden Informationen sind der Großteil der Antworten hier durchaus sinnvoll. Vielleicht hättest Du konkret sagen sollen, dass ein Dummyknoten unerlässlich ist, anstatt hier jeden, der versucht zu helfen zu beleidigen.</p>
<p>Die Art und Weise, wie Du Dich hier aufführst, zeigt wirklich eine grenzenlose (und mit Sicherheit nicht gerechtfertigte) Arroganz. Für jemanden, der hier Moderator ist, finde ich solch ein Verhalten wirklich ziemlich daneben.</p>
<p>Zum Thema:<br />
Vielleicht könnte man einen Dummy repräsentieren, indem man einen Pointer, anstatt einer Referenz übergibt, und dür Dummies überigbt man Null-Pointer. Das wäre auch etwas optimaler, was den Speicherbedarf betrifft, vor allem, wenn es sich um große &quot;Value-Typen&quot; handelt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1559942</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1559942</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Wed, 06 Aug 2008 06:09:43 GMT</pubDate></item><item><title><![CDATA[Reply to Dummy Knoten on Wed, 06 Aug 2008 07:50:02 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>aber ist das die standard variante oder gibt es etwas huebscheres ohne downcasts?</p>
</blockquote>
<p>Bisher habe ich in der Hinsicht immer nur Handgemachtes gesehen, ohne dass der Schwerpunkt auf Eleganz gelegt wurde. Wenn wir &quot;Node&quot; nicht als komplette Objektbeschreibung sondern nur als Spezifikation eines Interfaces betrachten, kommen wir weiter. Denn zwar kann ein Objekt eines bestimmten keine &quot;optionalen&quot; Member haben, wohl aber können wir Memberfunktionen definieren, die nicht in jedem Falle etwas brauchbares produzieren. Das könnte dann z.B. so aussehen:</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
    struct node;
    struct node_base
    {
        node_base* next;

        node_base(node_base* next = 0)
        : next( next )
        {}
        template&lt;typename T&gt;
        T&amp; data() { return static_cast&lt; node&lt; T &gt;* &gt;( this )-&gt;data_; }
        template&lt;typename T&gt;
        const T&amp; data() const { return static_cast&lt; const node&lt; T &gt;* &gt;( this )-&gt;data_; }
    };
    template&lt;typename T&gt;
    struct node : node_base
    {
        node(const T&amp; v = T(), node_base* next = 0)
            : node_base( next ), data_( v )
        T data_;
    };
</code></pre>
<p>Der ins Containerobjekt eingebettete Dummyknoten ist dann schlicht nur ein node_base und im client-code sind keine zusätzlichen Casts notwendig. Nützlich wird das vor allem dann, wenn wir spezielleren Anforderungen genügen wollen. z.B. könnten wir die verzögerte Konstruktion der Werte unterstützen. Ist unser T (exceptionfrei) move- bzw. copy-konstruierbar können wir dann ohne Overhead Einfügeoperationen formulieren, die die starke Garantie bieten.</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
class doubly_linked_list
{
private:
    struct node
    {
        node* next;
        node* prev;
        struct nolink_tag {};
        node(node* next, node* prev, nolink_tag)
            : next( next ), prev( prev )
        {}
        node(node* next, node* prev)
            : next( next ), prev( prev )
        {
            relink();
        }
        template&lt;typename... Args&gt;
        node(node* next, node* prev, Args&amp;&amp;... args)
            : next( next ), prev( prev )
        {
            construct( args... );
            relink();
        }
        void link()
        {
            prev-&gt;next = this;
            next-&gt;prev = this;
        }
        void unlink()
        {
            prev-&gt;next = next;
            next-&gt;prev = prev;
        }
        static constexpr size_t total_alignment()
        {
            return max( alignof( node ), alignof( T ) );
        }
        static constexpr size_t data_offset()
        {
            return ( sizeof( node ) + total_alignment() - 1 ) / total_alignment() * total_alignment();
        }
        T&amp; data()
        {
            return *reinterpret_cast&lt; T* &gt;( reinterpret_cast&lt; char* &gt;( this ) + data_offset() );
        }
        const T&amp; data() const
        {
            return const_cast&lt; node&amp; &gt;( *this ).data();
        }
        template&lt;typename... Args&gt;
        void construct(Args&amp;&amp;... args)
        {
            new( static_cast&lt; void* &gt;( addressof( data() ) ) T( forward&lt; Args &gt;( args )... );
        }
        void destroy()
        {
            data().~T();
        }
        static void* operator new(size_t size)
        {
            assert( size == sizeof( node ) );
            return ::new char[ data_offset() + sizeof( T ) ];
        }
        static void operator delete(void* p)
        {
            delete [] static_cast&lt; char* &gt;( p );
        }
    private:
        node(node&amp;);
        void operator=(node&amp;);
        static void* operator new[](size_t);
        static void operator delete[](void*);
    };
public:
    typedef T value_type;
    class iterator
    {
        node* node_ptr();
        /* ... */
    };
    class const_iterator { /* ... */ };
    doubly_linked_list()
        : dummy( &amp;dummy, &amp;dummy, node::nolink_tag() )
    {}
...
    template&lt;typename InputIterator&gt;
    void insert(iterator where, InputIterator first, InputIterator last)
    {
        typedef typename iterator_traits&lt; InputIterator &gt;::difference_type diff_t;
        if ( const diff_t dist = distance( first, last ) )
        {
            diff_t i = 0;
            try
            {
                node* dest = new node( where.node_ptr(), where.node_ptr()-&gt;prev );
                for ( ; ++i != dist; )
                    new node( where.node_ptr(), where.node_ptr()-&gt;prev );
                for ( ; first != last; ++first, --i )
                {
                    dest-&gt;construct( *first );
                    dest = dest-&gt;next;
                }
            }
            catch ( ... )
            {
                for ( ; i-- != 0; )
                {
                    node* p = where.node_ptr()-&gt;prev;
                    p-&gt;unlink();
                    delete p;
                }
                throw;
            }
        }
    }
private:
    node dummy;
};
</code></pre>
<p>Das Interface node ist hier immer noch im Wesentlichen identisch zum ursprünglichen mit node_base.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1559971</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1559971</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 06 Aug 2008 07:50:02 GMT</pubDate></item><item><title><![CDATA[Reply to Dummy Knoten on Wed, 06 Aug 2008 10:10:43 GMT]]></title><description><![CDATA[<p>Hast du bereits in Betracht gezogen das value_type Attribut in ein boost::optional zu verpacken, oder scheidet diese Lösung aus?</p>
<p>Bzw. suchst du überhaupt eine konkrete Lösung oder interressiert es dich einfach nur wie man das von dir vorgegebene Problem mit den vorgegebenen Rahmenbedingungen möglichst elegant lösen kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1560094</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1560094</guid><dc:creator><![CDATA[boost__optional]]></dc:creator><pubDate>Wed, 06 Aug 2008 10:10:43 GMT</pubDate></item><item><title><![CDATA[Reply to Dummy Knoten on Wed, 06 Aug 2008 10:55:50 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6642">@Camper</a>:<br />
nett nett, sowas in der Art habe ich gesucht.<br />
danke.<br />
manchmal hat man ein brett vor dem kopf - das hätte mir auch einfallen könne. simpel aber elegant <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>@die anderen:<br />
der dummy knoten steht nicht zur debatte - das ist eine themenverfehlung wer den weghaben will. ich brauche ihn und das ist einfach so.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1560135</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1560135</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Wed, 06 Aug 2008 10:55:50 GMT</pubDate></item><item><title><![CDATA[Reply to Dummy Knoten on Thu, 07 Aug 2008 04:44:22 GMT]]></title><description><![CDATA[<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> Ist das wirklich die Standardvorgehensweise, oder nur was selber ausgedachtes? Ein reinterpret cast auf einen Pointer der irgendwo in den Knoten zeigt, sieht mir mehr nach low level C style gehacke aus, als nach schöner Standardlösung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1560533</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1560533</guid><dc:creator><![CDATA[nicht wirklich oder]]></dc:creator><pubDate>Thu, 07 Aug 2008 04:44:22 GMT</pubDate></item><item><title><![CDATA[Reply to Dummy Knoten on Thu, 07 Aug 2008 09:01:07 GMT]]></title><description><![CDATA[<p>nicht wirklich oder schrieb:</p>
<blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> Ist das wirklich die Standardvorgehensweise, oder nur was selber ausgedachtes? Ein reinterpret cast auf einen Pointer der irgendwo in den Knoten zeigt, sieht mir mehr nach low level C style gehacke aus, als nach schöner Standardlösung.</p>
</blockquote>
<p>Da verwechselst du was.<br />
1. die ursprüngliche Frage zielte auf ein &quot;schönes&quot; und handliches Interface ab.<br />
2. der vorgestellte Code-Entwurf dient gerade dazu, dass es möglich ist, dieses Interface einfach und sauber zu halten, auch wenn die Innereien mal etwas komplizierter werden: das ist, was Eleganz ausmacht.<br />
3. &quot;low level C&quot; ist ein wichtiger Bestandteil von C++. So wenig, wie es sinnvoll es, in C++ im Allgemeinen einen C-Stil beizubehalten (einfach <em>weil</em> C++ bessere Abstraktionsmittel zur Verfügung stellt), ist eine Position gerechtfertigt, die C-Stil völlig verbietet, ohne mögliche Alternativen zu untersuchen.<br />
4. der gezeigte Code ist eine mögliche Lösung für ein spezifisches Problem. Ich würde nie soweit gehen, diese als einzig Möglichkeit hinzustellen. Jede hinreichend komplexe Stück Code stellt ohnehin immer nur einen Kompromiss dar. Bezogen auf diese Prämissen denke ich aber, das er relativ sauber gehalten ist (der Fokus ist auf Standardkonformität gerichtet, unter Annahme bestimmter Erweiterungen durch den nächsten Standard und somit auch Portabilität).<br />
5. wie ich bereits geschrieben habe, ist mir keine echete &quot;Standardvorgehensweise&quot; bekannt. Für ein echtes Pattern ist es inhaltlich zu dünn, für ein Idiom wiederum eher zu komplex.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1560663</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1560663</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 07 Aug 2008 09:01:07 GMT</pubDate></item></channel></rss>