<?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[Templatefunktion überladen: extra const-Versionen und char* für std::string nötig?]]></title><description><![CDATA[<p>Hi!</p>
<p>Ich hatte folgende Funktionen in einer Klasse:</p>
<pre><code>void SetInt(int val, int offset = -1);
void SetShort(short val, int offset = -1);
void SetRaw(const unsigned char* val, unsigned int size, int offset = -1);
void SetStr(const std::string&amp; val, int offset = -1);
</code></pre>
<p>Dann dachte ich mir, mache ich doch eine Templatefunktion für int, short usw. und Spezialisierungen für Rohdaten und Strings.<br />
Doch Spezialisierungen erlauben keine Defaultparameter, deshalb habe ich die Templatefunktion überladen:</p>
<pre><code>template&lt;typename T&gt; void Set(T value, int offset = -1);
void Set(const unsigned char* value, unsigned int size, int offset = -1);
void Set(unsigned char* value, unsigned int size, int offset = -1);
void Set(const std::string&amp; value, int offset = -1);
void Set(std::string&amp; value, int offset = -1);
void Set(const char* value, int offset = -1);
void Set(char* value, int offset = -1);
</code></pre>
<p>Wie man schon sieht, habe ich auch lauter const bzw. non-const Versionen schreiben müssen, sonst wäre eventuell die Templatefunktion aufgerufen worden.</p>
<p>Meine Fragen nun:<br />
Ist es irgendwie möglich, dass man nur eine const-Version schreibt, und trotzdem nicht die Templatefunktion aufgerufen wird, obwohl man einen non-const Typ übergibt?<br />
Und könnte man auch irgendwie die char*-Versionen weglassen und dafür sorgen, dass wenn man char* übergibt, automatisch die std::string Funktionen aufgerufen werden?</p>
<p>So muss man sehr viele Funktionen definieren, das finde ich unschön, da kann ich gleich wieder SetRaw, SetStr etc. machen <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>Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/330022/templatefunktion-überladen-extra-const-versionen-und-char-für-std-string-nötig</link><generator>RSS for Node</generator><lastBuildDate>Fri, 03 Jul 2026 15:37:36 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/330022.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 18 Dec 2014 14:05:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Templatefunktion überladen: extra const-Versionen und char* für std::string nötig? on Thu, 18 Dec 2014 14:05:17 GMT]]></title><description><![CDATA[<p>Hi!</p>
<p>Ich hatte folgende Funktionen in einer Klasse:</p>
<pre><code>void SetInt(int val, int offset = -1);
void SetShort(short val, int offset = -1);
void SetRaw(const unsigned char* val, unsigned int size, int offset = -1);
void SetStr(const std::string&amp; val, int offset = -1);
</code></pre>
<p>Dann dachte ich mir, mache ich doch eine Templatefunktion für int, short usw. und Spezialisierungen für Rohdaten und Strings.<br />
Doch Spezialisierungen erlauben keine Defaultparameter, deshalb habe ich die Templatefunktion überladen:</p>
<pre><code>template&lt;typename T&gt; void Set(T value, int offset = -1);
void Set(const unsigned char* value, unsigned int size, int offset = -1);
void Set(unsigned char* value, unsigned int size, int offset = -1);
void Set(const std::string&amp; value, int offset = -1);
void Set(std::string&amp; value, int offset = -1);
void Set(const char* value, int offset = -1);
void Set(char* value, int offset = -1);
</code></pre>
<p>Wie man schon sieht, habe ich auch lauter const bzw. non-const Versionen schreiben müssen, sonst wäre eventuell die Templatefunktion aufgerufen worden.</p>
<p>Meine Fragen nun:<br />
Ist es irgendwie möglich, dass man nur eine const-Version schreibt, und trotzdem nicht die Templatefunktion aufgerufen wird, obwohl man einen non-const Typ übergibt?<br />
Und könnte man auch irgendwie die char*-Versionen weglassen und dafür sorgen, dass wenn man char* übergibt, automatisch die std::string Funktionen aufgerufen werden?</p>
<p>So muss man sehr viele Funktionen definieren, das finde ich unschön, da kann ich gleich wieder SetRaw, SetStr etc. machen <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>Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2433508</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2433508</guid><dc:creator><![CDATA[Glump]]></dc:creator><pubDate>Thu, 18 Dec 2014 14:05:17 GMT</pubDate></item><item><title><![CDATA[Reply to Templatefunktion überladen: extra const-Versionen und char* für std::string nötig? on Thu, 18 Dec 2014 15:05:00 GMT]]></title><description><![CDATA[<p>Diese Konvertierungen sind keine Aufgabe deiner Klasse, daher lagere diese lieber aus:</p>
<pre><code class="language-cpp">// speichert einen allgemeinen rohen Datenblock
struct RawBlock {
  const char *first, *last;
};

// Convenience-Funktionen für Bekannte Datentypen
// Wenn als Konstruktor von RawData definiert, ist die Konvertierung implizit
RawBlock raw(int val;
RawBlock raw(short val);
RawBlock raw(const unsigned char* val, unsigned int size);
RawBlock raw(const std::string&amp; val);

// Allgemeine Raw-Funktion (macht etwas anderes als raw, daher anderer Name gerechtfertigt)
template &lt;typename T&gt; RawBlock generic_raw(T value);

// Und dann in der Klasse
void Set(RawBlock raw);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2433513</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2433513</guid><dc:creator><![CDATA[Plomp]]></dc:creator><pubDate>Thu, 18 Dec 2014 15:05:00 GMT</pubDate></item><item><title><![CDATA[Reply to Templatefunktion überladen: extra const-Versionen und char* für std::string nötig? on Thu, 18 Dec 2014 15:43:30 GMT]]></title><description><![CDATA[<p>Hmm, ich hätte die Klasse beschreiben sollen.<br />
Es ist eine Art &quot;Bytestream&quot;, intern wird ein vector&lt;unsigned char&gt; gehalten, und man kann mit Set(...) verschiedene Typen pushen (oder an einem offset setzen) und mit Get(...) soll man diese wieder auslesen können.</p>
<pre><code>unsigned char raw[] = { 42, -99, 188 };
const unsigned char* craw = raw;
string str = &quot;abc&quot;;
const char* c = &quot;abc&quot;;
char* cc = (char*)c;

bs.Set(craw, sizeof(raw)); // Set(const unsigned char* ...)
bs.Set(raw, sizeof(raw)); // Set(unsigned char* ...)
bs.Set(string(str)); // Set(const std::string&amp; ...)
bs.Set(str); // Set(std::string&amp; ...)
bs.Set(c); // Set(const char* ...)
bs.Set(&quot;abc&quot;); // Set(const char* ...)
bs.Set(cc); // Set(char* ...)
</code></pre>
<p>Das Problem ist, dass wenn ich nur die const-Versionen definiert hätte, würde bei Aufrufen mit non-const Typ die Templatefunktion genutzt werden, und das will ich eben verhindern:</p>
<pre><code>// Wäre &quot;void Set(unsigned char* ...)&quot; nicht definiert, würde &quot;Set(T value ...)&quot; aufgerufen werden
bs.Set(raw, sizeof(raw)); // Set(unsigned char* ...)
</code></pre>
<p>Außerdem würde ich mir gerne die char*/const* char Funktionen sparen. Wenn man also &quot;bs.Set(&quot;abc&quot;)&quot; macht, soll &quot;void Set(const std::string&amp; ...)&quot; genutzt werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2433515</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2433515</guid><dc:creator><![CDATA[Glump]]></dc:creator><pubDate>Thu, 18 Dec 2014 15:43:30 GMT</pubDate></item><item><title><![CDATA[Reply to Templatefunktion überladen: extra const-Versionen und char* für std::string nötig? on Fri, 19 Dec 2014 10:45:04 GMT]]></title><description><![CDATA[<p>Mit <a href="http://en.cppreference.com/w/cpp/types/enable_if" rel="nofollow">http://en.cppreference.com/w/cpp/types/enable_if</a> kann man das template nur für bestimmte Typen &quot;aktivieren&quot;, bzw. &quot;deaktivieren&quot;. Je nachdem was besser passt.</p>
<p>Aber so schlecht finde ich die originale Variante auch nicht. SetFloat, SetString, ... passt doch eigentlich?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2433609</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2433609</guid><dc:creator><![CDATA[___someone]]></dc:creator><pubDate>Fri, 19 Dec 2014 10:45:04 GMT</pubDate></item><item><title><![CDATA[Reply to Templatefunktion überladen: extra const-Versionen und char* für std::string nötig? on Fri, 19 Dec 2014 12:38:47 GMT]]></title><description><![CDATA[<p>Ahh interessant, gucke mir mal an ob ich was damit basteln kann.</p>
<p>Naja, weiß nicht, ich hab lieber nur ein Set(...) welches je nach übergebenem Typ anders arbeitet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2433619</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2433619</guid><dc:creator><![CDATA[Glump]]></dc:creator><pubDate>Fri, 19 Dec 2014 12:38:47 GMT</pubDate></item><item><title><![CDATA[Reply to Templatefunktion überladen: extra const-Versionen und char* für std::string nötig? on Fri, 19 Dec 2014 19:26:37 GMT]]></title><description><![CDATA[<p>___someone schrieb:</p>
<blockquote>
<p>Aber so schlecht finde ich die originale Variante auch nicht. SetFloat, SetString, ... passt doch eigentlich?</p>
</blockquote>
<p>Außerdem bräuchte ich dann immer 2 Versionen, signed und unsigned..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2433720</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2433720</guid><dc:creator><![CDATA[Glump]]></dc:creator><pubDate>Fri, 19 Dec 2014 19:26:37 GMT</pubDate></item></channel></rss>