<?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[Spezialisierung einer Listenklasse]]></title><description><![CDATA[<p>ich möchte ein Liste (one to many Beziehung) für meinen ORM Bibliothek erstellen. 1 zu N Beziehungen können ja mit oder ohne Relationstabelle realsiert werden:</p>
<p>Dazu würde ich gerne eine Lösung implementieren, die via Template Parameter entscheidet, ob eine eigene Relationstabelle angelegt wird oder nicht. Mein Ansatz ist, wenn ich die Set-Methode des Rückwärtslink angebe, soll keine Relationstabelle erzeugt werden. (Wie die Relationstabelle erzeugt wird, spielt hier keine Rolle)</p>
<p>Kurz, ich benötige eine Klassen-Template-Spezialisierung:</p>
<p>Pseudo Code Beispiel:</p>
<pre><code>// Entitäten
class address
{
  string street;
  int number;
  // ..

  void resident(const person &amp;p) { resident = p }

  person resident;
}

class person
{
  string name;

  // mit Relationstabelle
  list&lt;address, person&gt; addresses;

  // ohne Relationstabelle
  list&lt;address, person, &amp;address::resident&gt; addresses;
}
</code></pre>
<p>Hier mein Ansatz zur Spezialisierung</p>
<pre><code>// Liste
template &lt; class S, class T &gt;
class list { ... }

// Spezialisierte Liste
template &lt; class S, class T, void (T*::set_func)(const S&amp;) &gt;
class list { ... }
</code></pre>
<p>Leider habe ich noch keine Lösung für diese Spezialisierung gefunden. Hat jemand vielleicht einen Tipp für mich?</p>
<p>Besten Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/311157/spezialisierung-einer-listenklasse</link><generator>RSS for Node</generator><lastBuildDate>Mon, 03 Aug 2026 16:43:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/311157.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 28 Nov 2012 12:10:07 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Spezialisierung einer Listenklasse on Wed, 28 Nov 2012 12:10:07 GMT]]></title><description><![CDATA[<p>ich möchte ein Liste (one to many Beziehung) für meinen ORM Bibliothek erstellen. 1 zu N Beziehungen können ja mit oder ohne Relationstabelle realsiert werden:</p>
<p>Dazu würde ich gerne eine Lösung implementieren, die via Template Parameter entscheidet, ob eine eigene Relationstabelle angelegt wird oder nicht. Mein Ansatz ist, wenn ich die Set-Methode des Rückwärtslink angebe, soll keine Relationstabelle erzeugt werden. (Wie die Relationstabelle erzeugt wird, spielt hier keine Rolle)</p>
<p>Kurz, ich benötige eine Klassen-Template-Spezialisierung:</p>
<p>Pseudo Code Beispiel:</p>
<pre><code>// Entitäten
class address
{
  string street;
  int number;
  // ..

  void resident(const person &amp;p) { resident = p }

  person resident;
}

class person
{
  string name;

  // mit Relationstabelle
  list&lt;address, person&gt; addresses;

  // ohne Relationstabelle
  list&lt;address, person, &amp;address::resident&gt; addresses;
}
</code></pre>
<p>Hier mein Ansatz zur Spezialisierung</p>
<pre><code>// Liste
template &lt; class S, class T &gt;
class list { ... }

// Spezialisierte Liste
template &lt; class S, class T, void (T*::set_func)(const S&amp;) &gt;
class list { ... }
</code></pre>
<p>Leider habe ich noch keine Lösung für diese Spezialisierung gefunden. Hat jemand vielleicht einen Tipp für mich?</p>
<p>Besten Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2275433</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2275433</guid><dc:creator><![CDATA[zussel]]></dc:creator><pubDate>Wed, 28 Nov 2012 12:10:07 GMT</pubDate></item><item><title><![CDATA[Reply to Spezialisierung einer Listenklasse on Wed, 28 Nov 2012 13:52:22 GMT]]></title><description><![CDATA[<p>Ok, dass mit der Spezialisierung über die Memberfunktion geht wohl nicht so einfach. Deshalb werde ich über ein <code>bool</code> die Spezialisierung machen. (Wenn nicht noch einer mit 'ner coolen Idee um die Ecke kommt)</p>
<p>Gruß<br />
zussel</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2275473</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2275473</guid><dc:creator><![CDATA[zussel]]></dc:creator><pubDate>Wed, 28 Nov 2012 13:52:22 GMT</pubDate></item><item><title><![CDATA[Reply to Spezialisierung einer Listenklasse on Wed, 28 Nov 2012 14:31:24 GMT]]></title><description><![CDATA[<p>C++11 zur Rettung!</p>
<pre><code>template &lt;typename T1, typename T2, void (T1::* ...FUNC)(const T2&amp;)&gt; struct list; // Allgemeine Version, wird nie definiert
template &lt;typename T1, typename T2&gt; struct list&lt;T1, T2&gt; { };  // Partielle Spezialisierung für 2 Argumente...
template &lt;typename T1, typename T2, void (T1::*FUNC)(const T2&amp;) &gt; struct list&lt;T1, T2, FUNC&gt; { };  // ... und für drei Argumente

#include &lt;string&gt;

class person;
class address
{
  std::string street;
  int number;
public:
  void resident(const person &amp;p);
 };

class person
{
  std::string name;

  // mit Relationstabelle
  list&lt;address, person&gt; addresses1;

  // ohne Relationstabelle
  list&lt;address, person, &amp;address::resident&gt; addresses2;
};
</code></pre>
<p>P.S.: Es wäre übrigens ganz angenehm, wenn du Codebeispiele etwas &quot;korrekter&quot; geben würdest, so dass man nicht erst 15 Semikolons setzen braucht, wenn man von deinem Code ausgehend eine Lösung zeigen möchte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2275486</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2275486</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 28 Nov 2012 14:31:24 GMT</pubDate></item><item><title><![CDATA[Reply to Spezialisierung einer Listenklasse on Wed, 28 Nov 2012 15:12:56 GMT]]></title><description><![CDATA[<p>Oh, das sieht ja gut aus! Vielen Dank! Hatte diese Variante auch versucht, aber ohne die allgemeine Version.</p>
<p>Vielleicht kannst Du mir kurz erklären, wobei die allgemeine Version hier hilft.</p>
<p>Und: Versprochen, meine nächsten Code Schnippsel werden korrekt sein! <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>Gruß,<br />
zussel</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2275493</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2275493</guid><dc:creator><![CDATA[zussel]]></dc:creator><pubDate>Wed, 28 Nov 2012 15:12:56 GMT</pubDate></item><item><title><![CDATA[Reply to Spezialisierung einer Listenklasse on Wed, 28 Nov 2012 15:40:10 GMT]]></title><description><![CDATA[<p>Ok, habs verstanden. Durch das variadic template könnte ich 0 bis n Memberfunktionen übergeben. Und eine Spezialisierung hat 0 (keine) und die andere 1 (eine) Memberfunktion als Parameter.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2275498</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2275498</guid><dc:creator><![CDATA[zussel]]></dc:creator><pubDate>Wed, 28 Nov 2012 15:40:10 GMT</pubDate></item><item><title><![CDATA[Reply to Spezialisierung einer Listenklasse on Wed, 28 Nov 2012 16:01:11 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>C++11 zur Rettung!</p>
</blockquote>
<p>Oder ein Defaultargument</p>
<pre><code class="language-cpp">template &lt;typename T1, typename T2, void (T1::* FUNC)(const T2&amp;) = 0&gt; struct list; // zwei oder drei Argumente
template &lt;typename T1, typename T2&gt; struct list&lt;T1, T2&gt; { };  // Partielle Spezialisierung für 2 Argumente...
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2275504</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2275504</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 28 Nov 2012 16:01:11 GMT</pubDate></item><item><title><![CDATA[Reply to Spezialisierung einer Listenklasse on Wed, 28 Nov 2012 16:12:20 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>SeppJ schrieb:</p>
<blockquote>
<p>C++11 zur Rettung!</p>
</blockquote>
<p>Oder ein Defaultargument</p>
</blockquote>
<p>Argh! Irgendwie hatte ich ein Defaultparameter am Anfang im Hinterkopf (bei Typen würde man ja void* nehmen) und nicht dran gedacht, dass Pointer schließlich auch einen besonderen Nullwert haben dürfen. Aber dann sind irgendwie die C++11-Pferde mit mir durchgegangen und ich wollte unbedingt die variadic-template Lösung zum Funktionieren bringen (es dauert eine Weile bis man hier auf die richtige Syntax kommt <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/2275509</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2275509</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 28 Nov 2012 16:12:20 GMT</pubDate></item><item><title><![CDATA[Reply to Spezialisierung einer Listenklasse on Thu, 29 Nov 2012 08:20:57 GMT]]></title><description><![CDATA[<p>Mit einem Default Argument hatt eich auch schon rum gespielt. Hatte aber nicht funktioniert - da es nicht 0 war. Manchmal ist eine Lösung so einfach. Ein Pointer auf eine Funktion kann auch Null sein.</p>
<p>Vielen Dank für eure Lösungsvorschläge. Das hat mir wirklich weiter geholfen.</p>
<p>Auch wenn die Lösung mit den Variadic Templates c++11 State of the Art ist, so werde ich doch erstmal mit dem Defaultargument arbeiten und sehen, wie weit ich damit komme.</p>
<p>Danke,<br />
zussel</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2275675</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2275675</guid><dc:creator><![CDATA[zussel]]></dc:creator><pubDate>Thu, 29 Nov 2012 08:20:57 GMT</pubDate></item><item><title><![CDATA[Reply to Spezialisierung einer Listenklasse on Thu, 29 Nov 2012 09:16:44 GMT]]></title><description><![CDATA[<p>Hab die Variante mit dem Defaultwert jetzt mal ausprobiert und mein Compiler meckert:</p>
<pre><code>list.cpp:89:44: error: type ‘void (T1::*)(const T2&amp;)’ of template argument ‘0’ depends on template parameters
</code></pre>
<p>Die zweite Zeile mag er nicht:</p>
<pre><code>template &lt;typename T1, typename T2, void (T1::* FUNC)(const T2&amp;) = 0&gt; struct list;
template &lt;typename T1, typename T2&gt; struct list&lt;T1, T2&gt; { };
</code></pre>
<p>Anscheinend mag der keinen Defaultwert. Mein Compiler ist:</p>
<pre><code>g++ (GCC) 4.7.2
</code></pre>
<p>Keine Compilerargumente.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2275688</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2275688</guid><dc:creator><![CDATA[zussel]]></dc:creator><pubDate>Thu, 29 Nov 2012 09:16:44 GMT</pubDate></item><item><title><![CDATA[Reply to Spezialisierung einer Listenklasse on Tue, 04 Dec 2012 14:28:41 GMT]]></title><description><![CDATA[<p>Muss den Thread nochmal hoch pushen.</p>
<p>Leider konnte ich keine Lösung für den Defaultwert des Funktionspointers finden, daher bin ich zunächst nochmal den Weg mit den Variadic Templates gegangen.</p>
<p>Jetzt stehe ich aber vor dem nächsten Problem: Was ist, wenn ich einen builtin Typ ebenfalls ermöglichen möchte (z.B. einen int).</p>
<pre><code>template &lt;typename T1, typename T2, void (T1::* ...FUNC)(const T2&amp;)&gt; struct list; // Allgemeine Version, wird nie definiert
template &lt;typename T1, typename T2&gt; struct list&lt;T1, T2&gt; { };  // Partielle Spezialisierung für 2 Argumente...
template &lt;typename T1, typename T2, void (T1::*FUNC)(const T2&amp;) &gt; struct list&lt;T1, T2, FUNC&gt; { };  // ... und für drei Argumente

#include &lt;string&gt;

class person;
class address
{
  std::string street;
  int number;
public:
  void resident(const person &amp;p);
 };

class person
{
  std::string name;

  // NEU: builtin type
  list&lt;int, person&gt; integers;

  // mit Relationstabelle
  list&lt;address, person&gt; addresses1;

  // ohne Relationstabelle
  list&lt;address, person, &amp;address::resident&gt; addresses2;
};
</code></pre>
<p>Natürlich meckert hier der Compiler, dass er für einen builtin Typ keinen Funktionspointer anlegen kann. jetzt überlege ich, wie man die allgemeine Version dahingehend erweitern kann, dass sie auch bei builtins funktioniert.</p>
<p>Leider kann man ja keine &quot;Template Erweiterung&quot; machen, sondern nur eine Spezialisierung <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>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6642">@camper</a> und SeppJ: habt ihr noch einen guten Einfall?</p>
<p><strong>EDIT: Es ist auch OK, wenn das Ergebnis ist, dass das so nicht geht!</strong></p>
<p>Gruß,<br />
zussel</p>
<p>BTW: Wenn man eine eigene Bibliothek schreibt und einen Listenklasse anbietet möchte, die die gleiche Schnittstelle bietet, wie die STL Liste, ist es dann ok, wenn man diese Klasse auch &quot;list&quot; nennt (natürlich in einem eigenen Namspace).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2277098</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2277098</guid><dc:creator><![CDATA[zussel]]></dc:creator><pubDate>Tue, 04 Dec 2012 14:28:41 GMT</pubDate></item></channel></rss>