<?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[reinterpret_cast und &amp;quot;generische&amp;quot; Handles]]></title><description><![CDATA[<p>Hallo <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>Damit ich in Zukunft meine Klassen plattformübergreifend implementieren kann, nutze ich für die System-spezifischen Typen einfach einen Integer Handle-Typ (intptr_t) - manchmal auch vorbeugend mehrere.<br />
Mein ganzes Vorhaben geht von der Idee &quot;Ein Header - mehrere Implementierungen&quot; aus.</p>
<p>Bei einer Windows-Implementierung, reinterpret_caste ich dann den intptr_t&amp; in einen entsprechenden HANDLE&amp;-Typ um und kann dann das Handle mit der native API nutzen. Ebenso unter Linux. Obwohl nur als theoretisches Experiment gedacht funktioniert es ähnlich mit C++/CLI - intptr_t &quot;handlet&quot; ein GC-Handle (was man von gcroot so alles lernen kann <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> ).</p>
<p>Für den Fall, dass ein natives &quot;Handle&quot; größer als intptr_t ist, wird es auf dem Heap angelegt und der intptr_t bekommt den Pointer dort hin ... ein kleines template, dass beim Zugriff den intptr_t umschließt macht das auch ganz brav.</p>
<p>Jetzt frage ich aber dennoch mal die Experten: Ist denn sowas sinnvoll?</p>
<p>Ich könnte ja die System-Typen gleich im Header deklarieren, etwa in der Form</p>
<pre><code class="language-cpp">class ProcessInfo
{
...
private:
#ifdef SYS_WIN
	HANDLE	_handle;
#endif

#ifdef SYS_POSIX
	pid_t	_handle;	
#endif

#ifdef SYS_CLI
	gcroot&lt;System::Diagnostics::Process^&gt; _handle;
#endif
};
</code></pre>
<p>Ähnlich macht es ja boost wo einfach andere Header included werden und native Typen getypedeft werden... allerdings nicht gerade zum Vorteil der Lesbarkeit in den Headern. Nachdem ich ohnehin die Implementierung in eine statische Bibliothek kompiliere, möchte ich die Header übersichtlich halten und ich will weiters auch die Abhängigkeiten des headers (zb. von windows.h, unistd.h, ...) reduzieren. Da führt ja kein Weg an so einem &quot;generischen&quot; Handle vorbei, oder?</p>
<p>Also, haltet ihr das für sinnvoll eine Bibliothek so aufzubauen oder bietet der boost-Weg ungeahnte Vorzüge?</p>
<p>Danke für alle Infos <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>lG XOR</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/264572/reinterpret_cast-und-quot-generische-quot-handles</link><generator>RSS for Node</generator><lastBuildDate>Fri, 04 Sep 2026 18:00:25 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/264572.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 09 Apr 2010 12:13:22 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to reinterpret_cast und &amp;quot;generische&amp;quot; Handles on Fri, 09 Apr 2010 12:13:22 GMT]]></title><description><![CDATA[<p>Hallo <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>Damit ich in Zukunft meine Klassen plattformübergreifend implementieren kann, nutze ich für die System-spezifischen Typen einfach einen Integer Handle-Typ (intptr_t) - manchmal auch vorbeugend mehrere.<br />
Mein ganzes Vorhaben geht von der Idee &quot;Ein Header - mehrere Implementierungen&quot; aus.</p>
<p>Bei einer Windows-Implementierung, reinterpret_caste ich dann den intptr_t&amp; in einen entsprechenden HANDLE&amp;-Typ um und kann dann das Handle mit der native API nutzen. Ebenso unter Linux. Obwohl nur als theoretisches Experiment gedacht funktioniert es ähnlich mit C++/CLI - intptr_t &quot;handlet&quot; ein GC-Handle (was man von gcroot so alles lernen kann <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> ).</p>
<p>Für den Fall, dass ein natives &quot;Handle&quot; größer als intptr_t ist, wird es auf dem Heap angelegt und der intptr_t bekommt den Pointer dort hin ... ein kleines template, dass beim Zugriff den intptr_t umschließt macht das auch ganz brav.</p>
<p>Jetzt frage ich aber dennoch mal die Experten: Ist denn sowas sinnvoll?</p>
<p>Ich könnte ja die System-Typen gleich im Header deklarieren, etwa in der Form</p>
<pre><code class="language-cpp">class ProcessInfo
{
...
private:
#ifdef SYS_WIN
	HANDLE	_handle;
#endif

#ifdef SYS_POSIX
	pid_t	_handle;	
#endif

#ifdef SYS_CLI
	gcroot&lt;System::Diagnostics::Process^&gt; _handle;
#endif
};
</code></pre>
<p>Ähnlich macht es ja boost wo einfach andere Header included werden und native Typen getypedeft werden... allerdings nicht gerade zum Vorteil der Lesbarkeit in den Headern. Nachdem ich ohnehin die Implementierung in eine statische Bibliothek kompiliere, möchte ich die Header übersichtlich halten und ich will weiters auch die Abhängigkeiten des headers (zb. von windows.h, unistd.h, ...) reduzieren. Da führt ja kein Weg an so einem &quot;generischen&quot; Handle vorbei, oder?</p>
<p>Also, haltet ihr das für sinnvoll eine Bibliothek so aufzubauen oder bietet der boost-Weg ungeahnte Vorzüge?</p>
<p>Danke für alle Infos <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>lG XOR</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1880017</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880017</guid><dc:creator><![CDATA[xor]]></dc:creator><pubDate>Fri, 09 Apr 2010 12:13:22 GMT</pubDate></item><item><title><![CDATA[Reply to reinterpret_cast und &amp;quot;generische&amp;quot; Handles on Fri, 09 Apr 2010 12:14:59 GMT]]></title><description><![CDATA[<p>Das ist kein C++, sondern C++/CLI.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1880018</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880018</guid><dc:creator><![CDATA[Janjan]]></dc:creator><pubDate>Fri, 09 Apr 2010 12:14:59 GMT</pubDate></item><item><title><![CDATA[Reply to reinterpret_cast und &amp;quot;generische&amp;quot; Handles on Fri, 09 Apr 2010 12:27:09 GMT]]></title><description><![CDATA[<p>1. Ist das kein C++.<br />
2. Macht das nur dann Sinn, wenn du wirklich alle Plattformen so genau kennst, dass du weißt wo die Unterschiede liegen, sonst war's viel aufwand für nichts.<br />
3. Wird der Code dadurch natürlich extrem lesbar<br />
4. Bist du mit C++/CLI sowieso eingeschränkt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1880030</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880030</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Fri, 09 Apr 2010 12:27:09 GMT</pubDate></item><item><title><![CDATA[Reply to reinterpret_cast und &amp;quot;generische&amp;quot; Handles on Fri, 09 Apr 2010 12:44:06 GMT]]></title><description><![CDATA[<p>Janjan schrieb:</p>
<blockquote>
<p>Das ist kein C++, sondern C++/CLI.</p>
</blockquote>
<p>Nein, soll es eben nicht sein. Es geht um Portierbarkeit und ich wollte nur anfügen, dass es theoretisch möglich wäre mit einem &quot;generischen Handle&quot; im Header eine managed-Implementierung zu verstecken. Sinnvoll ist es eher nicht, weil das dotNet Framework die meisten Features bereits in schönen Klassen mitbringt, die unter Windows/Linux nicht einheitlich durch eine API abgedeckt sind. Da wäre es ziemlich dumm in C++/CLI die Bibliothek zu nutzen, wo das Objekt unmanaged erzeugt wird, aber die Implementierung wieder managed Objekte einsetzt ... aber ... es geht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Falls das Thema hier falsch ist, wo gehört es denn hin? Ich will doch wissen wie man besser einen plattform-unabhängigen Header schreibt, dessen Implementierungen dann auf jedem System anders aussehen ... für natives C++. Vergesst also den Hinweis auf C++/CLI. Bei mir sieht der Heaer derzeit ja so aus</p>
<pre><code class="language-cpp">class ProcessInfo
{
...
private:
  intptr_t _handle;
};
</code></pre>
<p>Macht doch zB. boost/thread/win32/thread_primitives.hpp auf ... Ich will doch nur wissen, ob es sinnvoller ist sowas im Header zu schreiben oder ob sowas nur im cpp file stehen soll (damit man die Abhängigkeiten nicht mitschleppt) <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>lG XOR</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1880038</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880038</guid><dc:creator><![CDATA[xor]]></dc:creator><pubDate>Fri, 09 Apr 2010 12:44:06 GMT</pubDate></item><item><title><![CDATA[Reply to reinterpret_cast und &amp;quot;generische&amp;quot; Handles on Fri, 09 Apr 2010 15:23:16 GMT]]></title><description><![CDATA[<p>idR macht man es so, dass man in einer header Datei die jeweiligen typedefs setzt.</p>
<p>Du nennst es zB process_t und machst daher irgendwo in einer je nachdem mehr oder weniger zentralen header datei folgendes:</p>
<pre><code class="language-cpp">#if defined(SYS_WIN)
    typedef HANDLE process_t;
#elif defined(SYS_POSIX)
    typedef pid_t process_t;
#elif defined(SYS_CLI)
    typdef gcroot&lt;System::Diagnostics::Process^&gt; process_t;
#else
#error &quot;unsupproted platform&quot;
#endif
</code></pre>
<p>dann kannst du ganz locker als interface sowas anbieten:</p>
<pre><code class="language-cpp">void terminate_process(process_t handle);
</code></pre>
<p>und terminate_process wird dann je nach system eben anders implementiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1880156</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880156</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Fri, 09 Apr 2010 15:23:16 GMT</pubDate></item><item><title><![CDATA[Reply to reinterpret_cast und &amp;quot;generische&amp;quot; Handles on Fri, 09 Apr 2010 18:33:04 GMT]]></title><description><![CDATA[<p>Aber managed und native zu supporten halte ich definitiv für Schwachsinn...<br />
Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1880236</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880236</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Fri, 09 Apr 2010 18:33:04 GMT</pubDate></item><item><title><![CDATA[Reply to reinterpret_cast und &amp;quot;generische&amp;quot; Handles on Fri, 09 Apr 2010 18:50:02 GMT]]></title><description><![CDATA[<p>theta schrieb:</p>
<blockquote>
<p>Aber managed und native zu supporten halte ich definitiv für Schwachsinn...<br />
Simon</p>
</blockquote>
<p>Da schließe ich mich an.</p>
<p>Wenn du wirklich mehrere Plattformen supporten willst, dann mach es so wie Shadow of Mine es geschrieben hat und lass die Typbezeichnungen so wie sie sind und verändere sie in einer extra Header. Ansonsten kann man den Code nämlich nicht wirklich gut lesen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1880245</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880245</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Fri, 09 Apr 2010 18:50:02 GMT</pubDate></item></channel></rss>