<?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[[ERLEDIGT] template einschränken]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>ich habe vier Funktionen die nahezu identisch sind,<br />
jedoch auf vier verschiedene Klassen angewendet werden.<br />
Ich möchte sie zu einem template Zusammenfassen.<br />
Kann ich es so einschränken, dass nur diese vier Klassen<br />
dieses template verwenden dürfen?</p>
<p>Wenn ja wie?</p>
<pre><code class="language-cpp">// Die Typedefs
typedef std::map&lt;PANO_UINT,UTM&gt;::const_iterator UTM_CONST_ITERATOR;
typedef std::map&lt;PANO_UINT,Knot&gt;::const_iterator KNOT_CONST_ITERATOR;
typedef std::map&lt;PANO_UINT,Edge&gt;::const_iterator EDGE_CONST_ITERATOR;
typedef std::map&lt;PANO_UINT,Face&gt;::const_iterator FACE_CONST_ITERATOR;

//Die Funktion ... als Beispiel für die Klasse UTM
PANO_UINT GEOTopology::get_coord_id_by_pos(PANO_UINT position_in_map) const{

	UTM_CONST_ITERATOR utmconstit = coords.begin();
	for(PANO_UINT i=1;i&lt;position_in_map;i++) utmconstit++;
	if(utmconstit == coords.end()) return 0;
	else return utmconstit-&gt;first;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/269107/erledigt-template-einschränken</link><generator>RSS for Node</generator><lastBuildDate>Mon, 31 Aug 2026 12:19:29 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/269107.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 18 Jun 2010 21:03:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [ERLEDIGT] template einschränken on Sat, 19 Jun 2010 10:01:40 GMT]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>ich habe vier Funktionen die nahezu identisch sind,<br />
jedoch auf vier verschiedene Klassen angewendet werden.<br />
Ich möchte sie zu einem template Zusammenfassen.<br />
Kann ich es so einschränken, dass nur diese vier Klassen<br />
dieses template verwenden dürfen?</p>
<p>Wenn ja wie?</p>
<pre><code class="language-cpp">// Die Typedefs
typedef std::map&lt;PANO_UINT,UTM&gt;::const_iterator UTM_CONST_ITERATOR;
typedef std::map&lt;PANO_UINT,Knot&gt;::const_iterator KNOT_CONST_ITERATOR;
typedef std::map&lt;PANO_UINT,Edge&gt;::const_iterator EDGE_CONST_ITERATOR;
typedef std::map&lt;PANO_UINT,Face&gt;::const_iterator FACE_CONST_ITERATOR;

//Die Funktion ... als Beispiel für die Klasse UTM
PANO_UINT GEOTopology::get_coord_id_by_pos(PANO_UINT position_in_map) const{

	UTM_CONST_ITERATOR utmconstit = coords.begin();
	for(PANO_UINT i=1;i&lt;position_in_map;i++) utmconstit++;
	if(utmconstit == coords.end()) return 0;
	else return utmconstit-&gt;first;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1914560</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1914560</guid><dc:creator><![CDATA[darkfate]]></dc:creator><pubDate>Sat, 19 Jun 2010 10:01:40 GMT</pubDate></item><item><title><![CDATA[Reply to [ERLEDIGT] template einschränken on Fri, 18 Jun 2010 21:12:23 GMT]]></title><description><![CDATA[<p>Beispielsweise</p>
<pre><code class="language-cpp">template&lt;typename&gt; struct fwd_type_if_allowed { };
template&lt;&gt; struct fwd_type_if_allowed&lt;erlaubte_klasse_1&gt; { typedef erlaubte_klasse_1 type; };
template&lt;&gt; struct fwd_type_if_allowed&lt;erlaubte_klasse_2&gt; { typedef erlaubte_klasse_2 type; };

// ...

template&lt;typename T&gt;
class foo {
  typedef typename fwd_type_if_allowed&lt;T&gt;::type value_type;
};
</code></pre>
<p>Wenn jemand das mit einem nicht whitegelisteten Typ versucht, kann fwd_type_if_allowed&lt;T&gt;::type nicht aufgelöst werden und das ganze geht daneben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1914567</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1914567</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Fri, 18 Jun 2010 21:12:23 GMT</pubDate></item><item><title><![CDATA[Reply to [ERLEDIGT] template einschränken on Fri, 18 Jun 2010 21:18:26 GMT]]></title><description><![CDATA[<p>Warum willst du es einschränken? Wenn jemand das benötigte Interface zur Verfügung stellt, dann ist das doch auch Ok, oder?</p>
<p>Es gibt Wege, wie du oben siehst, aber ich halte das oft für gar nicht nötig, dass du das einschränkst.</p>
<p>btw:<br />
Die Funktion gibt es bereits mehr oder weniger bereits:<br />
<a href="http://www.cplusplus.com/reference/std/iterator/advance/" rel="nofollow">http://www.cplusplus.com/reference/std/iterator/advance/</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1914571</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1914571</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Fri, 18 Jun 2010 21:18:26 GMT</pubDate></item><item><title><![CDATA[Reply to [ERLEDIGT] template einschränken on Fri, 18 Jun 2010 21:49:17 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Warum willst du es einschränken? Wenn jemand das benötigte Interface zur Verfügung stellt, dann ist das doch auch Ok, oder?</p>
<p>Es gibt Wege, wie du oben siehst, aber ich halte das oft für gar nicht nötig, dass du das einschränkst.</p>
<p>btw:<br />
Die Funktion gibt es bereits mehr oder weniger bereits:<br />
<a href="http://www.cplusplus.com/reference/std/iterator/advance/" rel="nofollow">http://www.cplusplus.com/reference/std/iterator/advance/</a></p>
</blockquote>
<p>Weil ich eine Templatefunktion für vier Topologieklassen erstellen möchte und sie woanders keinen Sinn machen. Wenn es doch etwas gibt, kann ich sie ja immer noch freischalten.</p>
<p>seldon schrieb:</p>
<blockquote>
<p>Beispielsweise</p>
<pre><code class="language-cpp">template&lt;typename&gt; struct fwd_type_if_allowed { };
template&lt;&gt; struct fwd_type_if_allowed&lt;erlaubte_klasse_1&gt; { typedef erlaubte_klasse_1 type; };
template&lt;&gt; struct fwd_type_if_allowed&lt;erlaubte_klasse_2&gt; { typedef erlaubte_klasse_2 type; };

// ...

template&lt;typename T&gt;
class foo {
  typedef typename fwd_type_if_allowed&lt;T&gt;::type value_type;
};
</code></pre>
<p>Wenn jemand das mit einem nicht whitegelisteten Typ versucht, kann fwd_type_if_allowed&lt;T&gt;::type nicht aufgelöst werden und das ganze geht daneben.</p>
</blockquote>
<p>Also damit habe ich ein wenig Probleme.</p>
<p>Wie sieht es dann im Endeffekt aus? So etwa?</p>
<pre><code class="language-cpp">template&lt;typename&gt; struct fwd_type_if_allowed { };

template&lt;&gt; struct 
fwd_type_if_allowed&lt;UTM&gt; { 
	typedef std::map&lt;PANO_UINT,UTM&gt;::const_iterator it;
	typedef dest this-&gt;coords;
}

template&lt;&gt; struct
fwd_type_if_allowed&lt;Knot&gt; { 
	typedef std::map&lt;PANO_UINT,Knot&gt;::const_iterator it; 
	typedef dest this-&gt;knots;
}

template&lt;&gt; struct
fwd_type_if_allowed&lt;Edge&gt; { 
	typedef std::map&lt;PANO_UINT,Edge&gt;::const_iterator it; 
	typedef dest this-&gt;edges;
}

template&lt;&gt; struct
fwd_type_if_allowed&lt;Face&gt; { 
	typedef std::map&lt;PANO_UINT,Face&gt;::const_iterator it; 
	typedef dest this-&gt;faces;
}

template&lt;typename T,PANO_UINT pos&gt;
PANO_UINT function get_id_by_pos(T, pos) {
	typedef typename fwd_type_if_allowed&lt;T&gt;::it iterator;
	typedef fwd_type_if_allowed&lt;T&gt;::dest dest;
	iterator = dest.begin();
	for(PANO_UINT i=1;i&lt;pos;i++) iterator++;
	if(iterator== dest.end()) return 0;
	else return iterator-&gt;first;
}
</code></pre>
<p>Wie kriege ich es hin dass ich mit dem Iterator das Ziel, die std::map in der ich suche auch geändert wird?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1914574</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1914574</guid><dc:creator><![CDATA[darkfate]]></dc:creator><pubDate>Fri, 18 Jun 2010 21:49:17 GMT</pubDate></item><item><title><![CDATA[Reply to [ERLEDIGT] template einschränken on Fri, 18 Jun 2010 21:49:34 GMT]]></title><description><![CDATA[<p>darkfate schrieb:</p>
<blockquote>
<p>Weil ich eine Templatefunktion für vier Topologieklassen erstellen möchte und sie woanders keinen Sinn machen. Wenn es doch etwas gibt, kann ich sie ja immer noch freischalten.</p>
</blockquote>
<p>Normalerweise arbeitet man andersrum. Du verhinderst ja auch nicht die Vererbung von von deiner Klasse Base für alle Typen außer Derived1, Derived2, ... <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="😉"
    /> Vorausgesetzt der Funktionsname ist gut, wird keiner auf die Idee kommen, die Funktion zu benutzen, wenn sie keinen Sinn macht. Daher brauchst du auch keine technische Einschränkung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1914580</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1914580</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Fri, 18 Jun 2010 21:49:34 GMT</pubDate></item><item><title><![CDATA[Reply to [ERLEDIGT] template einschränken on Fri, 18 Jun 2010 21:57:02 GMT]]></title><description><![CDATA[<p>Michael E. schrieb:</p>
<blockquote>
<p>darkfate schrieb:</p>
<blockquote>
<p>Weil ich eine Templatefunktion für vier Topologieklassen erstellen möchte und sie woanders keinen Sinn machen. Wenn es doch etwas gibt, kann ich sie ja immer noch freischalten.</p>
</blockquote>
<p>Normalerweise arbeitet man andersrum. Du verhinderst ja auch nicht die Vererbung von von deiner Klasse Base für alle Typen außer Derived1, Derived2, ... <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="😉"
    /> Vorausgesetzt der Funktionsname ist gut, wird keiner auf die Idee kommen, die Funktion zu benutzen, wenn sie keinen Sinn macht. Daher brauchst du auch keine technische Einschränkung.</p>
</blockquote>
<p>Ja ok, dann nenne mir bitte ein Beispiel außer knoten(koordinate),kante,masche die ein topologisches Objekt darstellen soll?</p>
<p>Außerdem würde es mir sehr helfen, wenn jemand mal da oben den code anschauen könnte und eventuell einen tipp warum es noch nicht funktioniert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1914581</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1914581</guid><dc:creator><![CDATA[darkfate]]></dc:creator><pubDate>Fri, 18 Jun 2010 21:57:02 GMT</pubDate></item><item><title><![CDATA[Reply to [ERLEDIGT] template einschränken on Fri, 18 Jun 2010 21:58:44 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">struct baum : std::string
{};
</code></pre>
<p>oder</p>
<pre><code class="language-cpp">struct mensch : std::complex&lt;int&gt;
{};
</code></pre>
<p>ergibt auch beides keinen sinn - trotzdem geht es.</p>
<p>es gibt so viele dinge, die unlogisch sind und trotzdem gehen - wenn man sich jedes mal nen kopf machen würde um all das zu verbieten, würde man nie fertig...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1914582</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1914582</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 18 Jun 2010 21:58:44 GMT</pubDate></item><item><title><![CDATA[Reply to [ERLEDIGT] template einschränken on Fri, 18 Jun 2010 22:01:57 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p>...</p>
</blockquote>
<p>Wie kriege ich es hin dass außer T auch noch die richtige Zielmap angesprochen wird?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1914584</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1914584</guid><dc:creator><![CDATA[darkfate]]></dc:creator><pubDate>Fri, 18 Jun 2010 22:01:57 GMT</pubDate></item><item><title><![CDATA[Reply to [ERLEDIGT] template einschränken on Fri, 18 Jun 2010 22:08:56 GMT]]></title><description><![CDATA[<p>btw:</p>
<pre><code class="language-cpp">template&lt;&gt; struct
fwd_type_if_allowed&lt;UTM&gt; {
    typedef std::map&lt;PANO_UINT,UTM&gt;::const_iterator it;
    typedef dest this-&gt;coords;
}
</code></pre>
<p>das ist mit sicherheit falsch - was möchtest du mit dem zweiten typedef bewirken?</p>
<blockquote>
<p>Wie kriege ich es hin dass außer T auch noch die richtige Zielmap angesprochen wird?</p>
</blockquote>
<p>hm? Sry, hab den Thread nur überflogen... ^^</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1914588</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1914588</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 18 Jun 2010 22:08:56 GMT</pubDate></item><item><title><![CDATA[Reply to [ERLEDIGT] template einschränken on Fri, 18 Jun 2010 22:13:05 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p>..</p>
</blockquote>
<p>Ich möchte mit einer Templatefunktion vier std::maps (Namen: coords,knots,edges,faces) durchsuchen können.</p>
<p>Im Grunde geht es einfach darum an eine bestimmte Position (Integerwert von Anfang an gezählt) zu fahren und von dort aus die id zurückzugeben.</p>
<p>Vielleicht wäre es besser gefragt ob es nicht schon solche STL Methode gibt?</p>
<p>Dennoch wäre es interessant zu wissen wie man so eine Einschränkung durchführen kann. Sei es nun sinnvoll oder nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1914590</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1914590</guid><dc:creator><![CDATA[darkfate]]></dc:creator><pubDate>Fri, 18 Jun 2010 22:13:05 GMT</pubDate></item><item><title><![CDATA[Reply to [ERLEDIGT] template einschränken on Fri, 18 Jun 2010 22:21:20 GMT]]></title><description><![CDATA[<p>darkfate schrieb:</p>
<blockquote>
<p>Ja ok, dann nenne mir bitte ein Beispiel außer knoten(koordinate),kante,masche die ein topologisches Objekt darstellen soll?</p>
</blockquote>
<p>Wir verstehen offensichtlich unter topologischen Objekten etwas Unterschiedliches, weshalb ich dir die Frage nicht beantworten kann. Mal schnell nachgeschaut, <a href="http://de.wikipedia.org/wiki/Geoobjekt#Topologie" rel="nofollow">http://de.wikipedia.org/wiki/Geoobjekt#Topologie</a> spricht von deinen drei Typen. Wenns keine andere Verwendungsmöglichkeit für die Funktion gibt außer für diese drei Typen, wird sie auch keiner mit einem anderen Typen verwenden und das Problem löst sich von selbst <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>Edit: Du sprichst von drei topologischen Grundtypen, hast aber vier Typen in deinem Quellcode, für die du die Funktion zugänglich machen willst. Eventuell hast du einen fünften vergessen oder stell dir vor, du hättest den vierten vergessen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1914591</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1914591</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Fri, 18 Jun 2010 22:21:20 GMT</pubDate></item><item><title><![CDATA[Reply to [ERLEDIGT] template einschränken on Fri, 18 Jun 2010 22:29:58 GMT]]></title><description><![CDATA[<p>Michael E. schrieb:</p>
<blockquote>
<p>...</p>
</blockquote>
<p>Wie bereits mehrfach angesprochen, möchte ich trotzdem wissen wie man es in Code umsetzen könnte.</p>
<p>Nachtrag:<br />
Ich würde doch gern bitten den Post durchzulesen. Es geht nicht um Einschränken oder nicht. Sinnvoll oder nicht. Darüber brauchen wir nicht zu diskutieren.</p>
<p>Es geht darum, dass mit diesen vier vorliegenden Klassen auch vier verschiedene std::maps angesprochen werden.</p>
<p>Für die Klasse UTM soll im Template die vorhandene std::map variable coords abgefragt werden.</p>
<p>Für die Klasse Knot -&gt; knots<br />
Für die Klasse Edge -&gt; edges<br />
Für die Klasse Face -&gt; faces</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1914592</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1914592</guid><dc:creator><![CDATA[darkfate]]></dc:creator><pubDate>Fri, 18 Jun 2010 22:29:58 GMT</pubDate></item><item><title><![CDATA[Reply to [ERLEDIGT] template einschränken on Fri, 18 Jun 2010 22:28:17 GMT]]></title><description><![CDATA[<p>wurde doch schon gesagt - entweder durch eine whitelist:</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
struct type_if_allowed;

struct type_if_allowed&lt;foo&gt;
{
  typedef int bar;
};
</code></pre>
<p>oder andersrum - also ne blacklist:</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
struct type_if_allowed
{
  typedef T bar;
};

struct type_if_allowed &lt;foo&gt;
{};
</code></pre>
<p>Verwendung auch wie schon gesagt:</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
void test(const T&amp; x)
{
  typedef typename type_if_allowed&lt;foo&gt;::bar foo;

  /*
    ...
  */
}
</code></pre>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1914594</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1914594</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 18 Jun 2010 22:28:17 GMT</pubDate></item><item><title><![CDATA[Reply to [ERLEDIGT] template einschränken on Fri, 18 Jun 2010 22:28:37 GMT]]></title><description><![CDATA[<p>Hey.</p>
<p>Ich hab mir zwar nicht alle Vorposts durchgelesen aber ich glaube ich weiß was du brauchst.</p>
<p>Also erstmal definierst du ein template, was von boost::mpl::false_ erbt und das spezialisierst du für deine 4 Klassen, und die erben dann von boost::mpl::true_. Ich habe hier mal ein kleines Beispiel wo ich das gebraucht habe. Da wollte ich eine Funktion, die nur für float, double, complex&lt;float&gt; und complex&lt;double&gt; verfügbar ist:</p>
<pre><code>template &lt;typename T&gt;
struct is_blas_type : boost::mpl::false_
{};

// FLOAT is a type supported by BLAS
template &lt;&gt;
struct is_blas_type&lt;float&gt; : boost::mpl::true_
{};

// DOUBLE is a type supported by BLAS
template &lt;&gt;
struct is_blas_type&lt;double&gt; : boost::mpl::true_
{};

// COMPLEX_FLOAT is a type supported by BLAS
template &lt;&gt;
struct is_blas_type&lt;std::complex&lt;float&gt; &gt; : boost::mpl::true_
{};

// COMPLEX_DOUBLE is a type supported by BLAS
template &lt;&gt;
struct is_blas_type&lt;std::complex&lt;double&gt; &gt; : boost::mpl::true_
{};

template &lt;typename T, typename U= void&gt;
struct enable_if_blas_type
  : boost::enable_if&lt;is_blas_type&lt;T&gt;, U&gt;
{};

}
</code></pre>
<p>Dann definierst du den Rückgabewert deiner Funktion mit deinem enable_if, zum Beispiel:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
typename boost::enable_if_c&lt;is_blas_type&lt;T&gt;::value, T&gt;::type
inline dot(vector&lt;T&gt; &amp;v1, vector&lt;T&gt; &amp;v2)
{...}
</code></pre>
<p>Das enable_if_c nimmt als erstes Templateargument dein struct, was entweder von true oder false erbt und wenn es false ist, gibts diese Funktion für deinen typename T im Prinzip gar nicht. Das zweite Argument ist dann der Rückgabetyp der Funktion und ist standardmäßig void.</p>
<p>Das _c bei enable_if_c und das ::value kannst du auch weglassen, dann sucht der automatisch nach nem Typen value.</p>
<p>Ich denke das ist doch das was du brauchst oder?</p>
<p>Grüße</p>
<p>Max</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1914595</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1914595</guid><dc:creator><![CDATA[Max3000]]></dc:creator><pubDate>Fri, 18 Jun 2010 22:28:37 GMT</pubDate></item><item><title><![CDATA[Reply to [ERLEDIGT] template einschränken on Fri, 18 Jun 2010 22:30:13 GMT]]></title><description><![CDATA[<p>Hab noch vergessen dass das alles in</p>
<pre><code class="language-cpp">#include &lt;boost/utility/enable_if.hpp&gt;
#include &lt;boost/mpl/bool.hpp&gt;
</code></pre>
<p>zu finden ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1914596</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1914596</guid><dc:creator><![CDATA[Max3000]]></dc:creator><pubDate>Fri, 18 Jun 2010 22:30:13 GMT</pubDate></item><item><title><![CDATA[Reply to [ERLEDIGT] template einschränken on Fri, 18 Jun 2010 22:31:52 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p>...</p>
</blockquote>
<p>Das habe ich hingekriegt. Es geht um was anderes. Die Problemstellung befindet sich über deinem (zitierten) Post.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1914597</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1914597</guid><dc:creator><![CDATA[darkfate]]></dc:creator><pubDate>Fri, 18 Jun 2010 22:31:52 GMT</pubDate></item><item><title><![CDATA[Reply to [ERLEDIGT] template einschränken on Fri, 18 Jun 2010 22:33:05 GMT]]></title><description><![CDATA[<p>Definier halt</p>
<pre><code class="language-cpp">typedef std::map&lt;PANO_UINT, typename fwd_type_if_allowed&lt;T&gt;::type&gt; coords_type;

coords_type coords;

// Später

typename coords_type::const_iterator iter = coords.begin();
</code></pre>
<p>Wie genau du es einbinden musst, kann ich dir nicht sagen, weil ich deinen Code nicht kenne. Du musst dich halt nur auf fwd_type_if_allowed&lt;T&gt;::type beziehen, denn wenn der Compiler das für einen nicht freigeschalteten Typ aufzulösen versucht, hagelt es Compilerfehler - wie ich ja bereits erwähnte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1914598</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1914598</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Fri, 18 Jun 2010 22:33:05 GMT</pubDate></item><item><title><![CDATA[Reply to [ERLEDIGT] template einschränken on Fri, 18 Jun 2010 22:37:05 GMT]]></title><description><![CDATA[<p>Michael E. schrieb:</p>
<blockquote>
<p>Wenns keine andere Verwendungsmöglichkeit für die Funktion gibt außer für diese drei Typen, wird sie auch keiner mit einem anderen Typen verwenden und das Problem löst sich von selbst <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>
</blockquote>
<p>Gegenbeispiel:<br />
Du hast eine allgemeine Funktion, die für alle Typen funktioniert und hast für z.B. 4 Typen eine spezielle Modifikation für diese Funktion, die noch besser/schneller/schöner ist und für die anderen Typen nicht funktioniert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1914599</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1914599</guid><dc:creator><![CDATA[Max3000]]></dc:creator><pubDate>Fri, 18 Jun 2010 22:37:05 GMT</pubDate></item><item><title><![CDATA[Reply to [ERLEDIGT] template einschränken on Fri, 18 Jun 2010 22:39:20 GMT]]></title><description><![CDATA[<p>Max3000 schrieb:</p>
<blockquote>
<p>Gegenbeispiel:<br />
Du hast eine allgemeine Funktion, die für alle Typen funktioniert und hast für z.B. 4 Typen eine spezielle Modifikation für diese Funktion, die noch besser/schneller/schöner ist und für die anderen Typen nicht funktioniert.</p>
</blockquote>
<p>-&gt;</p>
<p>Michael E. schrieb:</p>
<blockquote>
<p>Wenns keine andere Verwendungsmöglichkeit für die Funktion gibt außer für diese drei Typen</p>
</blockquote>
<p>Verwendungsmöglichkeit im Sinne von: Semantisch macht es für andere Typen keinen Sinn, nicht, dass es da eine tollere Implementierung gibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1914600</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1914600</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Fri, 18 Jun 2010 22:39:20 GMT</pubDate></item><item><title><![CDATA[Reply to [ERLEDIGT] template einschränken on Fri, 18 Jun 2010 22:52:07 GMT]]></title><description><![CDATA[<p>seldon schrieb:</p>
<blockquote>
<p>Definier haltWie genau du es einbinden musst, kann ich dir nicht sagen, weil ich deinen Code nicht kenne. Du musst dich halt nur auf fwd_type_if_allowed&lt;T&gt;::type beziehen, denn wenn der Compiler das für einen nicht freigeschalteten Typ aufzulösen versucht, hagelt es Compilerfehler - wie ich ja bereits erwähnte.</p>
</blockquote>
<p>Ein wenig abstrahiert:</p>
<pre><code class="language-cpp">std::map&lt;int, UTM&gt; coords;
std::map&lt;int, Knot&gt; knots;
std::map&lt;int, Edge&gt; edges;
std::map&lt;int, Edge&gt; faces;

template&lt;typename&gt; struct fwd_type_if_allowed { };

template&lt;&gt; struct
fwd_type_if_allowed&lt;UTM&gt; { 
	typedef std::map&lt;int,UTM&gt;::const_iterator it;

};

template&lt;&gt; struct
fwd_type_if_allowed&lt;Knot&gt; { 
	typedef std::map&lt;int,Knot&gt;::const_iterator it;
};

template&lt;&gt; struct
fwd_type_if_allowed&lt;Edge&gt; {
	typedef std::map&lt;int,Edge&gt;::const_iterator it;
};

template&lt;&gt; struct
fwd_type_if_allowed&lt;Face&gt; {
	typedef std::map&lt;int,Face&gt;::const_iterator it;
};

template&lt;typename T&gt;
int function get_id_by_pos(T, int pos) {

	typedef typename fwd_type_if_allowed&lt;T&gt;::it iterator;
	iterator = destination.begin();
	for(int i=1;i&lt;pos;i++) iterator++;
	if(iterator== destination.end()) return 0;
	else return iterator-&gt;first;
};
</code></pre>
<p>Die maps haben als id einen Integer.<br />
Ich brauche eine Funktion die mir zu einer bestimmten Position die id zurückliefert.</p>
<p>Irgendwie kriege ich nicht hin, das destination sich jeweils passend zur Klasse wechselt. Könnte jemand ein etwas funktionsfähiges posten?</p>
<p>Kann man mit der methode at( ) eine bestimmte Position anfahren?</p>
<p>Nachtrag:</p>
<p>Max3000 schrieb:</p>
<blockquote>
<p>...</p>
</blockquote>
<p>Dafür brauche ich doch Boost Bibliotheken?<br />
Außerdem ist die Frage mit den verschiedenen maps nicht geklärt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1914602</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1914602</guid><dc:creator><![CDATA[darkfate]]></dc:creator><pubDate>Fri, 18 Jun 2010 22:52:07 GMT</pubDate></item><item><title><![CDATA[Reply to [ERLEDIGT] template einschränken on Fri, 18 Jun 2010 23:01:37 GMT]]></title><description><![CDATA[<p>Z. B.:</p>
<pre><code class="language-cpp">template&lt;&gt; struct
fwd_type_if_allowed&lt;UTM&gt; {
    typedef std::map&lt;int,UTM&gt;::const_iterator it;
    static map&lt;int, UTM&gt;* destination;
};

map&lt;int, UTM&gt;* fwd_type_if_allowed&lt;UTM&gt;::destination = &amp;coords;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1914603</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1914603</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Fri, 18 Jun 2010 23:01:37 GMT</pubDate></item><item><title><![CDATA[Reply to [ERLEDIGT] template einschränken on Fri, 18 Jun 2010 23:03:51 GMT]]></title><description><![CDATA[<p>du möchtest die id des <code>pos</code> -ten elements aus der map wiedergeben?</p>
<pre><code class="language-cpp">template&lt;typename T, typename S = typename T::size_type&gt;
int get_id_by_pos(const T&amp; container, S pos)
{
  typedef typename container::const_iterator iter_t;

  iter_t i = container.begin();
  std::advance(i, pos);

  return i-&gt;first;
}
</code></pre>
<p>mir scheint aber, dass map nicht der optimale container für dein problem ist!?<br />
also die position eines elements in einer map anhand der reihenfolge zu speichern, ist nicht gerade das intelligenteste...</p>
<p>da ich aber vom eigtl thema keinen plan habe, kann ich das nur mal in die runde fragen... ;o)</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1914604</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1914604</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 18 Jun 2010 23:03:51 GMT</pubDate></item><item><title><![CDATA[Reply to [ERLEDIGT] template einschränken on Fri, 18 Jun 2010 23:05:45 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<pre><code class="language-cpp">std::advance(i, pos);

  return i-&gt;first;
</code></pre>
</blockquote>
<p>Das gibt aua, wenn pos zu groß ist <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/1914605</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1914605</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Fri, 18 Jun 2010 23:05:45 GMT</pubDate></item><item><title><![CDATA[Reply to [ERLEDIGT] template einschränken on Fri, 18 Jun 2010 23:08:20 GMT]]></title><description><![CDATA[<p>Michael E. schrieb:</p>
<blockquote>
<p>unskilled schrieb:</p>
<blockquote>
<pre><code class="language-cpp">std::advance(i, pos);

  return i-&gt;first;
</code></pre>
</blockquote>
<p>Das gibt aua, wenn pos zu groß ist <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>
</blockquote>
<p>sicherlich tut es das.<br />
ist aufgabe des anwendes dafür zu sorgen, keine unsinnigen werte zu übergeben.<br />
evtl noch nen assert am anfang einfügen:</p>
<pre><code class="language-cpp">template&lt;typename T, typename S = typename T::size_type&gt;
int get_id_by_pos(const T&amp; container, S pos)
{
  typedef typename container::const_iterator iter_t;

  assert(container.size() &gt; pos &amp;&amp; &quot;not a valid position&quot;);

  iter_t i = container.begin();
  std::advance(i, pos);

  return i-&gt;first;
}
</code></pre>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1914606</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1914606</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 18 Jun 2010 23:08:20 GMT</pubDate></item><item><title><![CDATA[Reply to [ERLEDIGT] template einschränken on Sat, 19 Jun 2010 00:16:10 GMT]]></title><description><![CDATA[<p>...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1914608</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1914608</guid><dc:creator><![CDATA[darkfate]]></dc:creator><pubDate>Sat, 19 Jun 2010 00:16:10 GMT</pubDate></item><item><title><![CDATA[Reply to [ERLEDIGT] template einschränken on Sat, 19 Jun 2010 00:15:43 GMT]]></title><description><![CDATA[<p>Super!</p>
<p>Anhand der hier vorgetragenen Codeschnipseln funktioniert es nun!</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

template&lt;typename&gt; struct fwd_type_if_allowed { };

template&lt;&gt; struct
fwd_type_if_allowed&lt;std::map&lt;int, double&gt;&gt; { 
  typedef std::map&lt;int,double&gt;::const_iterator it;
};

template&lt;&gt; struct
fwd_type_if_allowed&lt;std::map&lt;int, char&gt;&gt; {
  typedef std::map&lt;int,char&gt;::const_iterator it;
};

template&lt;typename T, typename S&gt; int get_id_by_pos(const T&amp; container, S pos)
{
	typedef typename fwd_type_if_allowed&lt;T&gt;::it iter_t;

	iter_t i = container.begin();
	std::advance(i, pos-1);

	return i-&gt;first;
} 

int main(int argc, char **argv){

	std::map&lt;int, double&gt; a;
	std::map&lt;int, char&gt; b; 

	a[11] = 10.1234;
	a[22] = 20.2345;
	a[33] = 30.4567;

	b[44] = 'A';
	b[55] = 'B';
	b[66] = 'C';

	cout &lt;&lt; get_id_by_pos(a,2) &lt;&lt; '\n';
	cout &lt;&lt; get_id_by_pos(b,3) &lt;&lt; '\n';

	return EXIT_SUCCESS;
}
</code></pre>
<p>Gibt es vielleicht einge Möglichkeit:</p>
<pre><code class="language-cpp">int a = a.get_id_by_pos(1);
int b = b.get_id_by_pos(2);
</code></pre>
<p>Zu templatisieren? Danke schonmal an alle die geantwortet haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1914613</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1914613</guid><dc:creator><![CDATA[darkfate]]></dc:creator><pubDate>Sat, 19 Jun 2010 00:15:43 GMT</pubDate></item></channel></rss>