<?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[Konvertierung von void* zu Template&amp;lt;T&amp;gt;]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich verwende eine C-API um Werte eines embedded device auszulesen, in etwa so:</p>
<pre><code class="language-cpp">int get_value(void* buf, size_t buf_size, int* val_type);
</code></pre>
<p>Wobei <code>val_type</code> bspw. sein kann</p>
<pre><code class="language-cpp">VALUE_TYPE_STRING
VALUE_TYPE_FLOAT
VALUE_TYPE_INT
//...
</code></pre>
<p>und von der Funktion gesetzt wird.</p>
<p>Ich moechte nun eine Funktion schreiben, die die Konvertierung automatisch vornimmt, in etwa so:</p>
<pre><code class="language-cpp">template&lt;ValType&gt;
bool get_value(ValType&amp; res);
</code></pre>
<p>Ich vergleiche mittels typeid ob <code>ValType</code> mit dem C-Datentyp kompatibel ist und falls ja, weise ich <code>res</code> den Wert zu.</p>
<p>Der Nachteil ist nun, dass</p>
<ul>
<li>nur die Datentypen konvertiert werden koennen, die in der Abfrage <em>if(typeid(...) = ...)</em> auftauchen. Fuer alle anderen Template-Argumente macht die Funktion keinen Sinn.</li>
<li>ueberhaupt typeid verwendet wird</li>
</ul>
<p>Ich frage mich, ob man so etwas auch anders machen kann, und wenn ja, wie?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/307880/konvertierung-von-void-zu-template-lt-t-gt</link><generator>RSS for Node</generator><lastBuildDate>Thu, 06 Aug 2026 08:13:40 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/307880.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 07 Sep 2012 15:55:46 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Konvertierung von void* zu Template&amp;lt;T&amp;gt; on Fri, 07 Sep 2012 15:55:46 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich verwende eine C-API um Werte eines embedded device auszulesen, in etwa so:</p>
<pre><code class="language-cpp">int get_value(void* buf, size_t buf_size, int* val_type);
</code></pre>
<p>Wobei <code>val_type</code> bspw. sein kann</p>
<pre><code class="language-cpp">VALUE_TYPE_STRING
VALUE_TYPE_FLOAT
VALUE_TYPE_INT
//...
</code></pre>
<p>und von der Funktion gesetzt wird.</p>
<p>Ich moechte nun eine Funktion schreiben, die die Konvertierung automatisch vornimmt, in etwa so:</p>
<pre><code class="language-cpp">template&lt;ValType&gt;
bool get_value(ValType&amp; res);
</code></pre>
<p>Ich vergleiche mittels typeid ob <code>ValType</code> mit dem C-Datentyp kompatibel ist und falls ja, weise ich <code>res</code> den Wert zu.</p>
<p>Der Nachteil ist nun, dass</p>
<ul>
<li>nur die Datentypen konvertiert werden koennen, die in der Abfrage <em>if(typeid(...) = ...)</em> auftauchen. Fuer alle anderen Template-Argumente macht die Funktion keinen Sinn.</li>
<li>ueberhaupt typeid verwendet wird</li>
</ul>
<p>Ich frage mich, ob man so etwas auch anders machen kann, und wenn ja, wie?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2249427</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2249427</guid><dc:creator><![CDATA[ernie++]]></dc:creator><pubDate>Fri, 07 Sep 2012 15:55:46 GMT</pubDate></item><item><title><![CDATA[Reply to Konvertierung von void* zu Template&amp;lt;T&amp;gt; on Fri, 07 Sep 2012 16:00:29 GMT]]></title><description><![CDATA[<p>Mit Template-Spezialisierung (wenn du aus der Funktion ein struct machst) ließe sich bestimmt etwas machen, aber warum nicht einfach klassisch? <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>
<pre><code class="language-cpp">bool get_value(float&amp; res);
bool get_value(int&amp; res);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2249431</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2249431</guid><dc:creator><![CDATA[Dobi]]></dc:creator><pubDate>Fri, 07 Sep 2012 16:00:29 GMT</pubDate></item><item><title><![CDATA[Reply to Konvertierung von void* zu Template&amp;lt;T&amp;gt; on Fri, 07 Sep 2012 23:21:20 GMT]]></title><description><![CDATA[<p>Überladungen sind hier definitiv besser. Templates würden dir nur helfen, wenn die den Rückgabetyp &quot;überladen&quot; möchtest:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
struct always_false
{
  static const bool value = false;
};

template &lt;typename T&gt;
T get_value()
{  
  static_assert(always_false&lt;T&gt;::value, &quot;...&quot;);
}

template &lt;&gt;
int get_value&lt;int&gt;();

template &lt;&gt;
float get_value&lt;float&gt;();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2249436</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2249436</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Fri, 07 Sep 2012 23:21:20 GMT</pubDate></item><item><title><![CDATA[Reply to Konvertierung von void* zu Template&amp;lt;T&amp;gt; on Fri, 07 Sep 2012 17:57:05 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>Templates würden dir nur helfen, wenn die den Rückgabetyp &quot;überladen&quot; möchtest</p>
</blockquote>
<p>Das waere noch praktischer. Ich muss dem Aufrufer nur mitteilen, ob die Konvertierung geklappt hat oder nicht.</p>
<p>Wozu ist dieses Konstrukt gut? (oder war das nur ein Beispiel?)</p>
<blockquote>
<pre><code class="language-cpp">template &lt;typename T&gt;
  struct always_false
  {
    static const bool value = false;
  };
  
  static_assert(always_false&lt;T&gt;::value, &quot;...&quot;);
</code></pre>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2249451</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2249451</guid><dc:creator><![CDATA[ernie++]]></dc:creator><pubDate>Fri, 07 Sep 2012 17:57:05 GMT</pubDate></item><item><title><![CDATA[Reply to Konvertierung von void* zu Template&amp;lt;T&amp;gt; on Fri, 07 Sep 2012 18:10:15 GMT]]></title><description><![CDATA[<p>Das ist ein Trick, um dem User eine schoene Fehlermeldung geben zu koennen, wenn er versucht, das Template mit einem nicht unterstuetzten Typen zu instanzieren. Da das static_assert aber bereits bei der Definition triggern wuerde, wenn die Bedingung nicht vom Template-Parameter abhaengt, behilft cooky sich hier always_false, das diese Abhaengikeit herstellt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2249452</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2249452</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Fri, 07 Sep 2012 18:10:15 GMT</pubDate></item><item><title><![CDATA[Reply to Konvertierung von void* zu Template&amp;lt;T&amp;gt; on Fri, 07 Sep 2012 18:23:24 GMT]]></title><description><![CDATA[<p>ernie++ schrieb:</p>
<blockquote>
<p>cooky451 schrieb:</p>
<blockquote>
<p>Templates würden dir nur helfen, wenn die den Rückgabetyp &quot;überladen&quot; möchtest</p>
</blockquote>
<p>Das waere noch praktischer. Ich muss dem Aufrufer nur mitteilen, ob die Konvertierung geklappt hat oder nicht.</p>
</blockquote>
<p>Nun, das könnte man mit Exceptions machen. Ist halt die Frage: Ist es <strong>erwartet</strong> dass das mal schief geht? Würde die Ausführung dann normal weiter gehen? Dann lass es so wie es ist. Ist es nicht erwartet, und werden später sehr wahrscheinlich große Teile des Codes übersprungen, wenn der Aufruf fehlschlägt? Dann nimm Templates und Exceptions. Wenn's ne Bibliothek ist in der beides der Fall sein kann, kannst du auch beides anbieten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2249454</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2249454</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Fri, 07 Sep 2012 18:23:24 GMT</pubDate></item></channel></rss>