<?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[Funktions-Template blockieren]]></title><description><![CDATA[<p>Hallo</p>
<p>Ich möchte, dass von einem Funktionstemplate nur bestimmte Spezialsierungen zugelassen sind. Ich hätte gern, dass bei Verwendung des normalen Templates gar nicht erst kompiliert werden kann. Kennt jemand eine bessere / elegantere Umsetzung als die hier?</p>
<p>Hier mein Ansatz:</p>
<pre><code class="language-cpp">struct invalid_byte_count
{
};

template&lt;size_t size&gt;
inline void Reverse(void *data)
{
  // hier verschluckt sich der Kompiler
  invalid_byte_count test = data;
}

template&lt;&gt;
inline void Reverse&lt;2&gt;(void *data)
{
  std::swap(reinterpret_cast&lt;char*&gt;(data)[0], reinterpret_cast&lt;char*&gt;(data)[1]);
}

template&lt;&gt;
inline void Reverse&lt;4&gt;(void *data)
{
  std::swap(reinterpret_cast&lt;char*&gt;(data)[0], reinterpret_cast&lt;char*&gt;(data)[3]);
  std::swap(reinterpret_cast&lt;char*&gt;(data)[1], reinterpret_cast&lt;char*&gt;(data)[2]);
}

template&lt;&gt;
inline void Reverse&lt;8&gt;(void *data)
{
  std::swap(reinterpret_cast&lt;char*&gt;(data)[0], reinterpret_cast&lt;char*&gt;(data)[7]);
  std::swap(reinterpret_cast&lt;char*&gt;(data)[1], reinterpret_cast&lt;char*&gt;(data)[6]);
  std::swap(reinterpret_cast&lt;char*&gt;(data)[2], reinterpret_cast&lt;char*&gt;(data)[5]);
  std::swap(reinterpret_cast&lt;char*&gt;(data)[3], reinterpret_cast&lt;char*&gt;(data)[4]);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/195212/funktions-template-blockieren</link><generator>RSS for Node</generator><lastBuildDate>Tue, 29 Sep 2026 21:55:17 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/195212.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 15 Oct 2007 13:39:58 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Funktions-Template blockieren on Mon, 15 Oct 2007 13:39:58 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Ich möchte, dass von einem Funktionstemplate nur bestimmte Spezialsierungen zugelassen sind. Ich hätte gern, dass bei Verwendung des normalen Templates gar nicht erst kompiliert werden kann. Kennt jemand eine bessere / elegantere Umsetzung als die hier?</p>
<p>Hier mein Ansatz:</p>
<pre><code class="language-cpp">struct invalid_byte_count
{
};

template&lt;size_t size&gt;
inline void Reverse(void *data)
{
  // hier verschluckt sich der Kompiler
  invalid_byte_count test = data;
}

template&lt;&gt;
inline void Reverse&lt;2&gt;(void *data)
{
  std::swap(reinterpret_cast&lt;char*&gt;(data)[0], reinterpret_cast&lt;char*&gt;(data)[1]);
}

template&lt;&gt;
inline void Reverse&lt;4&gt;(void *data)
{
  std::swap(reinterpret_cast&lt;char*&gt;(data)[0], reinterpret_cast&lt;char*&gt;(data)[3]);
  std::swap(reinterpret_cast&lt;char*&gt;(data)[1], reinterpret_cast&lt;char*&gt;(data)[2]);
}

template&lt;&gt;
inline void Reverse&lt;8&gt;(void *data)
{
  std::swap(reinterpret_cast&lt;char*&gt;(data)[0], reinterpret_cast&lt;char*&gt;(data)[7]);
  std::swap(reinterpret_cast&lt;char*&gt;(data)[1], reinterpret_cast&lt;char*&gt;(data)[6]);
  std::swap(reinterpret_cast&lt;char*&gt;(data)[2], reinterpret_cast&lt;char*&gt;(data)[5]);
  std::swap(reinterpret_cast&lt;char*&gt;(data)[3], reinterpret_cast&lt;char*&gt;(data)[4]);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1385614</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1385614</guid><dc:creator><![CDATA[__Stefan__]]></dc:creator><pubDate>Mon, 15 Oct 2007 13:39:58 GMT</pubDate></item><item><title><![CDATA[Reply to Funktions-Template blockieren on Mon, 15 Oct 2007 13:42:46 GMT]]></title><description><![CDATA[<p>Etwas kürzer: Du lässt den Rumpf der allgemeinen Funktion komplett weg - dann wird sich der Linker beschweren.</p>
<p>Aber was ist überhaupt der Sinn dieser Funktion?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1385624</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1385624</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 15 Oct 2007 13:42:46 GMT</pubDate></item><item><title><![CDATA[Reply to Funktions-Template blockieren on Mon, 15 Oct 2007 13:53:56 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Etwas kürzer: Du lässt den Rumpf der allgemeinen Funktion komplett weg - dann wird sich der Linker beschweren.</p>
<p>Aber was ist überhaupt der Sinn dieser Funktion?</p>
</blockquote>
<p>Damit will ich von big endian nach little endian umwandeln und umgekehrt. Am liebsten hätte ich es eigentlich, wenn die Funktionen nur integrale Typen fressen würden. Momentan weiss ich nicht, wie ich das realisieren könnte.</p>
<p>edit: ich meinte eigentlich eingebaute typen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1385643</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1385643</guid><dc:creator><![CDATA[__Stefan__]]></dc:creator><pubDate>Mon, 15 Oct 2007 13:53:56 GMT</pubDate></item><item><title><![CDATA[Reply to Funktions-Template blockieren on Mon, 15 Oct 2007 13:53:00 GMT]]></title><description><![CDATA[<p>evtl. ein fall für <a href="http://www.boost.org/doc/html/boost_staticassert.html" rel="nofollow">http://www.boost.org/doc/html/boost_staticassert.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1385645</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1385645</guid><dc:creator><![CDATA[cpt. obvious]]></dc:creator><pubDate>Mon, 15 Oct 2007 13:53:00 GMT</pubDate></item><item><title><![CDATA[Reply to Funktions-Template blockieren on Mon, 15 Oct 2007 14:16:21 GMT]]></title><description><![CDATA[<p>Wenn du nur 3 verschiedene Varianten - noch dazu mit jeweils unabhängiger Umsetzung - benötigst, ist ein Template wohl etwas übertrieben. Schreib dir einfach Überladungen für alle Typen, die du brauchst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1385674</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1385674</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 15 Oct 2007 14:16:21 GMT</pubDate></item><item><title><![CDATA[Reply to Funktions-Template blockieren on Mon, 15 Oct 2007 14:30:43 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Wenn du nur 3 verschiedene Varianten - noch dazu mit jeweils unabhängiger Umsetzung - benötigst, ist ein Template wohl etwas übertrieben. Schreib dir einfach Überladungen für alle Typen, die du brauchst.</p>
</blockquote>
<p>Naja, dann müsste ich ja für jeden Typ eine Überladung schreiben und dann noch für unsigned. Nicht unbedingt ein geringerer Aufwand.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1385689</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1385689</guid><dc:creator><![CDATA[__Stefan__]]></dc:creator><pubDate>Mon, 15 Oct 2007 14:30:43 GMT</pubDate></item><item><title><![CDATA[Reply to Funktions-Template blockieren on Mon, 15 Oct 2007 15:06:23 GMT]]></title><description><![CDATA[<p><strong>Stefan</strong> schrieb:</p>
<blockquote>
<p>Damit will ich von big endian nach little endian umwandeln und umgekehrt. Am liebsten hätte ich es eigentlich, wenn die Funktionen nur integrale Typen fressen würden. Momentan weiss ich nicht, wie ich das realisieren könnte.<br />
edit: ich meinte eigentlich eingebaute typen.</p>
</blockquote>
<p>Hallo Stefan,</p>
<p>mit boost ist es recht einfach:</p>
<pre><code class="language-cpp">#include &lt;string&gt;
#include &lt;boost/utility/enable_if.hpp&gt;
#include &lt;boost/type_traits.hpp&gt;

namespace reverse_details
{
    template&lt; unsigned N &gt;
    void reverseN( char* p );

    template&lt;&gt; void reverseN&lt; 2 &gt;( char* p )
    {
        std::swap( p[1], p[0] );
    }
    template&lt;&gt; void reverseN&lt; 4 &gt;( char* p )
    {
        std::swap( p[3], p[0] );
        std::swap( p[2], p[1] );
    }
    // ...
}
template&lt; typename T &gt;
typename boost::enable_if&lt; typename boost::is_integral&lt; T &gt;, void &gt;::type 
    Reverse( T&amp; x )
{
    reverse_details::reverseN&lt; sizeof(T) &gt;( reinterpret_cast&lt; char* &gt;( &amp;x ) );
}

// Anwendung
    int a = 4;
    Reverse( a );
    string txt;
    //Reverse( txt ); // übesetzt nicht
</code></pre>
<p>Mehr Info dazu gibt's in der boost-Hilfe zu <a href="http://www.boost.org/doc/html/boost_typetraits/reference.html#boost_typetraits.is_integral" rel="nofollow">integral_type</a> und <a href="http://www.boost.org/libs/utility/enable_if.html" rel="nofollow">enable_if</a>.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1385725</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1385725</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Mon, 15 Oct 2007 15:06:23 GMT</pubDate></item></channel></rss>