<?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[Konstruktor für spezielle Typen &amp;quot;Umleiten&amp;quot;?]]></title><description><![CDATA[<p>Ich hab folgendes Problem:<br />
Ich hab eine Klasse mit zwei verschiedenen Kontruktoren, einer davon soll zwei verschiedene integrale Parameter haben, der andere ein Iteratorpaar als Parameter. Die Deklaratoinen sähen also in etwa wie folgt aus:</p>
<pre><code class="language-cpp">class C
{
public:
  C(int i, long l);

  template &lt;class Iter&gt;
  C(Iter first, Iter last);
};
</code></pre>
<p>Nun möchte ich aber, wenn zwei int als Parameter übergeben werden, der ersten Konstruktor aufrufen lassen. Wie bekomm ich das ohne große Codeduplizierung und ohne große Abfragen im zweiten Ctor hin?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/246784/konstruktor-für-spezielle-typen-quot-umleiten-quot</link><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 19:11:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/246784.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 01 Aug 2009 16:27:19 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Konstruktor für spezielle Typen &amp;quot;Umleiten&amp;quot;? on Sat, 01 Aug 2009 16:27:19 GMT]]></title><description><![CDATA[<p>Ich hab folgendes Problem:<br />
Ich hab eine Klasse mit zwei verschiedenen Kontruktoren, einer davon soll zwei verschiedene integrale Parameter haben, der andere ein Iteratorpaar als Parameter. Die Deklaratoinen sähen also in etwa wie folgt aus:</p>
<pre><code class="language-cpp">class C
{
public:
  C(int i, long l);

  template &lt;class Iter&gt;
  C(Iter first, Iter last);
};
</code></pre>
<p>Nun möchte ich aber, wenn zwei int als Parameter übergeben werden, der ersten Konstruktor aufrufen lassen. Wie bekomm ich das ohne große Codeduplizierung und ohne große Abfragen im zweiten Ctor hin?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1753631</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1753631</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Sat, 01 Aug 2009 16:27:19 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor für spezielle Typen &amp;quot;Umleiten&amp;quot;? on Sat, 01 Aug 2009 16:55:53 GMT]]></title><description><![CDATA[<p>Wenn zwei int übergeben werden sollte der 1. Konstruktor aufgerufen werden und ein int in long gecastet werden, sofern der Konstruktor nicht explicit ist</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1753641</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1753641</guid><dc:creator><![CDATA[söfgjsä]]></dc:creator><pubDate>Sat, 01 Aug 2009 16:55:53 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor für spezielle Typen &amp;quot;Umleiten&amp;quot;? on Sat, 01 Aug 2009 18:42:19 GMT]]></title><description><![CDATA[<p>söfgjsä schrieb:</p>
<blockquote>
<p>Wenn zwei int übergeben werden sollte der 1. Konstruktor aufgerufen werden und ein int in long gecastet werden, sofern der Konstruktor nicht explicit ist</p>
</blockquote>
<p>Nein, dass geht nicht.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9960">@pumuckl</a>,<br />
Mach doch einen zusätzlichen Konstruktor, welcher zwei <code>int</code> Typen entgegen nimmt.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1753680</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1753680</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sat, 01 Aug 2009 18:42:19 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor für spezielle Typen &amp;quot;Umleiten&amp;quot;? on Sat, 01 Aug 2009 22:12:46 GMT]]></title><description><![CDATA[<p>Hm. Ginge das nicht mit boost::enable_if?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1753793</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1753793</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 01 Aug 2009 22:12:46 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor für spezielle Typen &amp;quot;Umleiten&amp;quot;? on Sat, 01 Aug 2009 22:15:33 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Hm. Ginge das nicht mit boost::enable_if?</p>
</blockquote>
<p>hatte ich mit enable_if nicht immer den rückgabetyp maniputtgemacht? sowas hat der konstruktor leider nicht. ich könnte ein drittes pseudoargument puttmachen. naja, irgendwie nicht lecker.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1753798</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1753798</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 01 Aug 2009 22:15:33 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor für spezielle Typen &amp;quot;Umleiten&amp;quot;? on Sat, 01 Aug 2009 23:45:19 GMT]]></title><description><![CDATA[<p>Aber das funktioniert doch Oo</p>
<pre><code class="language-cpp">class C
{
public:
  C(int i, long l){}

  template &lt;class Iter&gt;
  C(Iter first, Iter last){}
};

int main()
{
    int a, b;
    C c(a,b); //funktioniert
}
</code></pre>
<p>Oder verstehe ich das Problem falsch <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1753829</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1753829</guid><dc:creator><![CDATA[söfgjsä]]></dc:creator><pubDate>Sat, 01 Aug 2009 23:45:19 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor für spezielle Typen &amp;quot;Umleiten&amp;quot;? on Sun, 02 Aug 2009 00:22:56 GMT]]></title><description><![CDATA[<p>Ist explicit machen und auf long casten keine Option? Oder einen Konstruktor int,int der ein Objekt erstellt und dann nen swap macht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1753840</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1753840</guid><dc:creator><![CDATA[Xebov]]></dc:creator><pubDate>Sun, 02 Aug 2009 00:22:56 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor für spezielle Typen &amp;quot;Umleiten&amp;quot;? on Sun, 02 Aug 2009 01:02:33 GMT]]></title><description><![CDATA[<p>söfgjsä schrieb:</p>
<blockquote>
<p>Oder verstehe ich das Problem falsch <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
</blockquote>
<p>Ja oder du merkst nicht, dass es die falsche Version aufruft. Es ruft nämlich die Templateversion auf. Mach mal das:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class C
{
public:
  C(int i, long l)
  {
    std::cout &lt;&lt; &quot;int i, long l&quot; &lt;&lt; std::endl;
  }

  template &lt;class Iter&gt;
  C(Iter first, Iter last)
  {
    std::cout &lt;&lt; &quot;Iter first, Iter last&quot; &lt;&lt; std::endl;
  }
};

int main()
{
  int a, b;
  C c(a,b); // Gibt garantiert &quot;Iter first, Iter last&quot; aus.
  // Und das will er ja gerade nicht ;)
}
</code></pre>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13960">@hustbaer</a>,<br />
Und wie stellst du dir das vor? <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="🙂"
    /><br />
Es gibt nicht mal eine eindeutige Möglichkeit einen Iterator zu erkennen ...</p>
<p>Ich bin immer noch für einen Konstruktor mit <code>int, int</code> . Um doppelten Intialisierungslisten Code zu verhindern, kann man die Member intern in ein <code>struct</code> verpacken. Zudem kann man eine private <code>init</code> Funktion verwenden. Also kurz skizziert:</p>
<pre><code class="language-cpp">class C
{
private:
  struct
  {
    int m_i;
    long m_l;

    Members(int i, long l)
      : m_i(i)
      , m_l(l)
    {
    }
  }
  m_members;

public:
  C(int i, long l)
    : m_members(i, l)
  {
    init();
  }

  C(int i, int b)
    : m_members(i, b)
  {
    init();
  }

  template &lt;class Iter&gt;
  C(Iter first, Iter last)
    : m_members(0, 0)
  {
    // whatever ...
  }

private:
  void init()
  {
    // whatever ...
  }
};
</code></pre>
<p>Kommt natürlich ganz darauf an, wie die Klasse intern aussieht.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1753843</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1753843</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sun, 02 Aug 2009 01:02:33 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor für spezielle Typen &amp;quot;Umleiten&amp;quot;? on Sun, 02 Aug 2009 07:39:52 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Hm. Ginge das nicht mit boost::enable_if?</p>
</blockquote>
<p>Ja, an <a href="http://en.wikipedia.org/wiki/Substitution_failure_is_not_an_error" rel="nofollow">SFINAE</a> hatte ich auch gedacht. Es fehlt nur noch eine Abfrage, ob &quot;Iter&quot; wirklich ein Iterator ist.</p>
<pre><code class="language-cpp">class A
{
public:
  A(int,long);

  template&lt;typename Iter&gt;
  A(Iter beg, Iter end,
    typename boost::enable_if&lt;is_iterator&lt;Iter&gt;,char&gt;::type=0)
  {
    //...
  }
};
</code></pre>
<p>Leider fällt mir spontan nichts für <code>is_iterator</code> ein. Mit Concepts wär das einfach gewesen (requires <code>InputIterator&lt;Iter&gt;</code> ).</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1753862</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1753862</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Sun, 02 Aug 2009 07:39:52 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor für spezielle Typen &amp;quot;Umleiten&amp;quot;? on Sun, 02 Aug 2009 07:47:08 GMT]]></title><description><![CDATA[<p>Nachtrag:<br />
Es gibt eine Diskussion is_iterator in der <a href="http://lists.boost.org/Archives/boost/2004/08/70544.php" rel="nofollow">Boost Mailingliste</a>. Es sieht nicht so aus, als ob es in C++03 möglich wäre.</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1753866</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1753866</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Sun, 02 Aug 2009 07:47:08 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor für spezielle Typen &amp;quot;Umleiten&amp;quot;? on Sun, 02 Aug 2009 08:43:57 GMT]]></title><description><![CDATA[<p>SFINAE in C++0x mit Default-Template-Argumenten für Funktionen und decltype:</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
struct make
{
  static T&amp; lvalue();
  static T&amp;&amp; rvalue();
};

class A
{
public:
  A(int,long);

  template&lt; typename Iter, // Dereferenzieren möglich?
            typename Test = decltype(*make&lt;Iter&gt;::rvalue()) &gt;
  //                                 ^
  A(Iter beg, Iter end)
  {
    // ...
  }
};
</code></pre>
<p>müsste nach meinem Verständnis in C++0x funktionieren. Diese oder ähnliche Varianten habe ich aber unter g++ 4.3 mit -std=c++0x nicht zum Laufen bekommen, da der Compiler es vorzieht, eine Fehlermeldung auszuspucken, statt das Template einfach zu ignorieren falls das Einsetzen schiefgeht. Ihr könnt ja mal mit g++ 4.4 testen -- der soll, was SFINAE angeht, gnädiger sein.</p>
<p>Mit diesen &quot;erweiterten SFINAE Möglichkeiten&quot; wären wir zumindest nicht ganz verloren ... so ohne Concepts. Die ganzen syntaktischen Typ-Bedingungen sollten per decltype testbar 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 />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1753886</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1753886</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Sun, 02 Aug 2009 08:43:57 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor für spezielle Typen &amp;quot;Umleiten&amp;quot;? on Sun, 02 Aug 2009 12:39:18 GMT]]></title><description><![CDATA[<p>Sebastian Pizer schrieb:</p>
<blockquote>
<pre><code class="language-cpp">template&lt;typename Iter&gt;
  A(Iter beg, Iter end,
    typename boost::enable_if&lt;is_iterator&lt;Iter&gt;,char&gt;::type=0)
</code></pre>
</blockquote>
<p>Guter Ansatz, ich werds mal mit mit <code>boost::disable_if&lt;is_integral&lt;Iter&gt;,char&gt;::type = 0</code> versuchen wenn ich das nächstemal dran sitze <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1753972</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1753972</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Sun, 02 Aug 2009 12:39:18 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor für spezielle Typen &amp;quot;Umleiten&amp;quot;? on Sun, 02 Aug 2009 12:48:13 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Guter Ansatz, ich werds mal mit mit <code>boost::disable_if&lt;is_integral&lt;Iter&gt;,char&gt;::type = 0</code> versuchen wenn ich das nächstemal dran sitze <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>So geht's natürlich auch! <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="🙂"
    /><br />
Oder vielleicht sogar mit <code>is_convertible&lt;Iter,int&gt;</code> und <code>is_convertible&lt;Iter,long&gt;</code> .</p>
<p>Ich habe übrigends vorhin gcc-4.4.1 kompiliert, um das C++0x-Beispiel mit decltype zu testen: Es funzt. <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 />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1753973</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1753973</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Sun, 02 Aug 2009 12:48:13 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor für spezielle Typen &amp;quot;Umleiten&amp;quot;? on Sun, 02 Aug 2009 13:10:28 GMT]]></title><description><![CDATA[<p>War leider nichts - er versucht krampfhaft die Iteratorversion aufzurufen bei zwei ints und stolpert über enable_if::type <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/1753980</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1753980</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Sun, 02 Aug 2009 13:10:28 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor für spezielle Typen &amp;quot;Umleiten&amp;quot;? on Sun, 02 Aug 2009 13:35:11 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>War leider nichts - er versucht krampfhaft die Iteratorversion aufzurufen bei zwei ints und stolpert über enable_if::type <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>
</blockquote>
<p>Kein Wunder, es ist ja auch kein Substitutionsfehler. Die Substitution klappt einwandfrei. Grundsätzlich müsstest du sowas machen:</p>
<pre><code class="language-cpp">template&lt;typename IterT&gt;
C(IterT, IterT, typename std::iterator_traits&lt;IterT&gt;::iterator_category category = typename std::iterator_traits&lt;IterT&gt;::iterator_category())
{
}
</code></pre>
<p>Nur dass es problematisch ist, weil es unter MSVC zum Beispiel auch Spezialisierungen für <code>std::iterator_traits</code> für <code>int</code> , <code>double</code> , <code>float</code> , <code>long</code> , <code>short</code> , usw. gibt. Daher funktioniert dies auch nicht ... Es gibt eben keine Möglichkeit einen Iterator zu erkennen.</p>
<p>Das einzige was du machen könntest, sind gewisse Typen explizit auszuschliessen. Ehm, das müsste dann so gehen:</p>
<pre><code class="language-cpp">struct EmptyType { };

temlate&lt;typename T&gt;
struct ExcludedTraits
{
  typename EmptyType Allowed;
};

template&lt;&gt;
struct ExcludedTraits&lt;int&gt;
{
  // int ausschliessen.
};

class C
{
public:
  C(int, long) { std::cout &lt;&lt; &quot;funzt&quot; &lt;&lt; std::endl; }

  template&lt;typename IterT&gt;
  C(IterT, IterT, 
     typename ExcludedTraits&lt;IterT&gt;::Allowed = typename ExcludedTraits&lt;IterT&gt;::Allowed())
  {
    std::cout &lt;&lt; &quot;meep&quot; &lt;&lt; std::endl;
  }
};

int main()
{
  int a = 0;
  int b = 0;

  C c(a, b); // sollte gehen ...
}
</code></pre>
<p>Vielleicht kann man es über Typlisten noch ein wenig vereinfachen.<br />
Aber ob das viel einfacher ist als einfach einen zusätzlichen Konstruktor? <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>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1753985</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1753985</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sun, 02 Aug 2009 13:35:11 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor für spezielle Typen &amp;quot;Umleiten&amp;quot;? on Sun, 02 Aug 2009 13:45:06 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>War leider nichts - er versucht krampfhaft die Iteratorversion aufzurufen bei zwei ints und stolpert über enable_if::type <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>
</blockquote>
<p>Wie wär's mit etwas Code? Ich habe vorhin das hier probiert:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;boost/utility/enable_if.hpp&gt;
#include &lt;boost/type_traits/is_integral.hpp&gt;

void foo(int, long)
{
	std::cout &lt;&lt; &quot;1\n&quot;;
}

template&lt;typename Iter&gt;
void foo(Iter beg, Iter end,
	typename boost::disable_if&lt;boost::is_integral&lt;Iter&gt;,char&gt;::type=0)
{
	std::cout &lt;&lt; &quot;2\n&quot;;
}

int main()
{
	foo(23,42);
}
</code></pre>
<p>und es macht genau das, was es soll (&quot;1&quot; ausgeben).</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1753986</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1753986</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Sun, 02 Aug 2009 13:45:06 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor für spezielle Typen &amp;quot;Umleiten&amp;quot;? on Sun, 02 Aug 2009 13:52:00 GMT]]></title><description><![CDATA[<p>Hätte ein normaler User so eine Frage gestellt, wäre schon längst die Frage gekommen: Was willst du eigentlich konkret damit erreichen? Da du aber sicher weiß, was du willst, ist die Farge wohl überflüssig. Mich interessiert aber schon, warum man einen Konstruktor benötigt, der ein <code>int</code> und ein <code>long</code> als Parameter hat. Schließlich gilt immer <code>sizeof(int) &lt;= sizeof(long)</code> , also könntest du auch zwei long als Parameter nehmen.</p>
<p>Gruß<br />
Don06</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1753988</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1753988</guid><dc:creator><![CDATA[Don06]]></dc:creator><pubDate>Sun, 02 Aug 2009 13:52:00 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor für spezielle Typen &amp;quot;Umleiten&amp;quot;? on Sun, 02 Aug 2009 13:54:18 GMT]]></title><description><![CDATA[<p>Oh Gott, ich trottel ... klar funktioniert dies! Ich habe <code>boost::enable_if&lt;cond, char&gt;</code> mit <code>Select&lt;cond, char, void&gt;</code> verwechselt.</p>
<p>Ich ziehe mein vorheriges Posting zurück ... peinlich, peinlich ...</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1753989</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1753989</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sun, 02 Aug 2009 13:54:18 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor für spezielle Typen &amp;quot;Umleiten&amp;quot;? on Sun, 02 Aug 2009 17:04:43 GMT]]></title><description><![CDATA[<p>Ich bin dabei ein Containertemplate zu schreiben. Wie bei std::vector solls einen Ctor für ein iterator-Range geben, sowie einen für size_type und T. letzterem kann man bei std::vector für T=int oder T=long usw. zwei int übergeben, bzw. sollte man. In der Standardbibliothek die ich hier habe ist es so gelöst, dass der Range-Ctor bei Iter=int sich so verhält wie der NxT-Ctor. Ich wollte nach eier Lösung suchen wo gleich der richtige Ctor gewählt wird.</p>
<p>Mein Ansatz bisher:</p>
<pre><code class="language-cpp">template &lt;class T&gt;
class MyContainer /*: boost::equality_comparable&lt;MyContainer&lt;T&gt; &gt;*/
{
  template &lt;class Iter&gt;
  struct DisableInt
  {
    typedef typename boost::disable_if&lt;
      boost::is_integral&lt;Iter&gt;, char
    &gt;::type type;
  };

public:

  MyContainer();
  explicit MyContainer( size_type n, const_value_type&amp; value= T());
  template &lt;class InputIterator &gt;
  MyContainer(InputIterator first, InputIterator last, 
         typename DisableInt&lt;InputIterator&gt;::type = 0);
};
</code></pre>
<p>Beim Compilieren gibts dann entsprechend eine Fehlermeldung:</p>
<pre><code>c:\development\projects\lib_pumu\src\pumu\container\mycontainer.hpp(26) : error C2039: 'type' : is not a member of 'boost::disable_if&lt;Cond,T&gt;'
1&gt;        with
1&gt;        [
1&gt;            Cond=boost::is_integral&lt;int&gt;,
1&gt;            T=char
1&gt;        ]
1&gt;        c:\development\projects\lib_pumu\test\pumu\container\testmycontainer.cpp(81) : see reference to class template instantiation 'pumu::container::MyContainer&lt;T&gt;::DisableInt&lt;Iter&gt;' being compiled
1&gt;        with
1&gt;        [
1&gt;            T=int,
1&gt;            Iter=int
1&gt;        ]
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1754100</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1754100</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Sun, 02 Aug 2009 17:04:43 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor für spezielle Typen &amp;quot;Umleiten&amp;quot;? on Sun, 02 Aug 2009 17:43:49 GMT]]></title><description><![CDATA[<p>Wirf das <code>struct DisableInt</code> weg. So wird SFINAE nicht funktionieren. Der Substitutionsfehler passiert nicht im Funktionskopf, sondern in der Struktur <code>DisableInt</code> . Der Fehler muss aber im Funktionskopf passieren, damit es funktioniert.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1754123</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1754123</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sun, 02 Aug 2009 17:43:49 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor für spezielle Typen &amp;quot;Umleiten&amp;quot;? on Sun, 02 Aug 2009 18:06:54 GMT]]></title><description><![CDATA[<p>Ja hatte da n Denkfehler. Hiermit gehts:</p>
<pre><code class="language-cpp">template &lt;class Iter&gt;
struct DisableInt : public boost::disable_if&lt;boost::is_integral&lt;Iter&gt;, char&gt;
{};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1754142</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1754142</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Sun, 02 Aug 2009 18:06:54 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor für spezielle Typen &amp;quot;Umleiten&amp;quot;? on Sun, 02 Aug 2009 23:03:25 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Nur dass es problematisch ist, weil es unter MSVC zum Beispiel auch Spezialisierungen für <code>std::iterator_traits</code> für <code>int</code> , <code>double</code> , <code>float</code> , <code>long</code> , <code>short</code> , usw. gibt. Daher funktioniert dies auch nicht ... Es gibt eben keine Möglichkeit einen Iterator zu erkennen.</p>
</blockquote>
<p>Das ist komisch. Weisst du wozu es diese Spezialisierungen gibt?</p>
<p>Aber mal davon abgesehen... könnte man sich nicht zu nutze machen dass in dem Fall <code>Iter</code> und <code>std::iterator_traits&lt;Iter&gt;::value_type</code> der selbe Typ sind?</p>
<p>Ich muss sagen, als ich enable_if vorgeschlagen habe, bin ich einfach davon ausgegangen, dass es recht einfach möglich sein muss <code>is_iterator</code> zu implementieren, da es ja <code>std::iterator_traits</code> gibt.</p>
<p>Irgendwie ziemlich doof dass es <em>doch nicht</em> so einfach ist <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/1754293</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1754293</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 02 Aug 2009 23:03:25 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor für spezielle Typen &amp;quot;Umleiten&amp;quot;? on Mon, 03 Aug 2009 06:49:22 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Irgendwie ziemlich doof dass es <em>doch nicht</em> so einfach ist <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>
</blockquote>
<p>Ich schätze mal wenns so einfach wäre gäbs bei boost auch ein is_iterator oder ähnliches. Es gibt in der Mailing-List schon eine längere Diskussion zu dem Thema:</p>
<p><a href="http://lists.boost.org/Archives/boost/2004/08/70530.php" rel="nofollow">http://lists.boost.org/Archives/boost/2004/08/70530.php</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1754339</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1754339</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 03 Aug 2009 06:49:22 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor für spezielle Typen &amp;quot;Umleiten&amp;quot;? on Mon, 03 Aug 2009 16:04:49 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Das ist komisch. Weisst du wozu es diese Spezialisierungen gibt?</p>
</blockquote>
<p>Nicht die Bohne einer Ahnung! Es steht nicht mal hier etwas:<br />
<a href="http://msdn.microsoft.com/en-us/library/zdxb97eh.aspx" rel="nofollow">http://msdn.microsoft.com/en-us/library/zdxb97eh.aspx</a></p>
<p>Ich weiss es selber nur, weil ich mal etwas über <code>std::iterator_traits</code> lösen wollte und dabei voll auf die Schnauze gefallen bin. Vor allem habe ich zuerst ziemlich lange gesucht, bis ich gemerkt habe, dass da zusätzliche Spezialisierungen vorhanden sind. Ich wäre niemals auf diese Idee gekommen <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>
<p>Hey ... moment mal ... würde sowas nicht gehen?</p>
<pre><code class="language-cpp">template&lt;typename CategoryT&gt;
struct isValidIteratorCategory
{
  enum ( value = 0 };
};

template&lt;&gt;
struct isValidIteratorCategory&lt;std::input_iterator_tag&gt;
{
  enum { value = 1; };
};

template&lt;&gt;
struct isValidIteratorCategory&lt;std::output_iterator_tag&gt;
{
  enum { value = 1; };
};

template&lt;&gt;
struct isValidIteratorCategory&lt;std::forward_iterator_tag&gt;
{
  enum { value = 1; };
};

template&lt;&gt;
struct isValidIteratorCategory&lt;std::bidirectional_iterator_tag&gt;
{
  enum { value = 1; };
};

template&lt;&gt;
struct isValidIteratorCategory&lt;std::random_access_iterator_tag&gt;
{
  enum { value = 1; };
};

template&lt;typename IterT&gt;
struct IsIterator
{
  enum { value = isValidIteratorCategory&lt;typename std::iterator_traits&lt;IterT&gt;::iterator_category&gt;::value };
};

template&lt;typename T&gt;
struct IsIterator&lt;T*&gt;
{
  enum { value = 1; };
};

template&lt;typename T&gt;
struct IsIterator&lt;T const*&gt;
{
  enum { value = 1; }
};
</code></pre>
<p>Oder überseh ich etwas?</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1754653</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1754653</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Mon, 03 Aug 2009 16:04:49 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor für spezielle Typen &amp;quot;Umleiten&amp;quot;? on Mon, 03 Aug 2009 16:38:17 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Oder überseh ich etwas?</p>
</blockquote>
<pre><code class="language-cpp">class Alien {};
int main()
{
    cout &lt;&lt; IsIterator&lt;Alien&gt;::value;
}
</code></pre>
<p>Das ist dann möglicherweise der Grund, weshalb Spezialisierungen für int&amp;co. eingeführt werden, um nicht schon iterator_traits&lt;int&gt;::iterator_category auszusteigen, sondern ggf. das Ergebnis per sfinae zu verwerten.</p>
<p>vielleicht so</p>
<pre><code class="language-cpp">typedef char no;
typedef no yes[2];
no&amp; tag_test(...);
template &lt;typename T&gt; yes&amp; tag_test(const T&amp;, iterator_traits&lt;T&gt;::iterator_category*=0);
template &lt;typename T&gt;
struct has_tag : mpl::bool_&lt;sizeof(tag_test(*(T*)0))==sizeof(yes)&gt; {};

typedef mpl::vector&lt;input_iterator_tag,output_iterator_tag,forward_iterator_tag,random_access_iterator_tag&gt; valid_tags;
template &lt;typename T, bool = has_tag&lt;T&gt;::value&gt;
struct is_iterator : mpl::contains&lt;valid_tags,T&gt; {};
template &lt;typename T&gt;
struct is_iterator&lt; T, false&gt; : mpl::bool_&lt;false&gt; {};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1754657</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1754657</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 03 Aug 2009 16:38:17 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor für spezielle Typen &amp;quot;Umleiten&amp;quot;? on Thu, 06 Aug 2009 09:32:08 GMT]]></title><description><![CDATA[<p>Wenn ich das richtig sehe brauch ich noch nichtmal den Dummy-Parameter - folgendes compiliert bei mir:</p>
<pre><code class="language-cpp">template &lt;class T&gt;
struct DisableInt : public boost::disable_if&lt;boost::is_integral&lt;T&gt;, T&gt;{};

void foo(int i, short l)
{
   cout &lt;&lt; &quot;integral&quot; &lt;&lt; endl;
}

template&lt;class I&gt;
void foo(I first, typename DisableInt&lt;I&gt;::type last)
{
  cout &lt;&lt; &quot;iterator&quot; &lt;&lt; endl;
}

int main()
{
   int a[] = {1, 2, 3, 4, 5};
   std::vector&lt;int&gt; vec(a, a+5);

   foo(3, 6); //integral
   foo(a, a+5); //iterator
   foo(vec.begin(), vec.end()); //iterator
}
</code></pre>
<p>Gibts irgendwelche Fallen in die ich da tappen könnte oder ist das ok?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1756157</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1756157</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 06 Aug 2009 09:32:08 GMT</pubDate></item></channel></rss>