<?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[Alternative zu void* ? C++11]]></title><description><![CDATA[<p>Hallo Community ich möchte eine Registry Klasse machen.</p>
<p>Es gibt ja 3 Arten von ValueTypes in Registry:<br />
REG_SZ<br />
REG_DWORD<br />
REG_BINARY</p>
<p>und Abarten von diesen drei:<br />
REG_MULTI_SZ<br />
REG_EXPAND_SZ</p>
<p>so habe ich mir gedacht, dass ich es mit Abstrakter Klassen mache</p>
<pre><code>enum REG_TYPE
{
	REG_SZ,
	REG_DWORD,
	REG_BINARY
};

class Key
{
	private:
        protected:
		HKEY hKey;
		std::wstring path;
		std::wstring KeyName;

	public:
		virtual void* read() = 0;
		virtual bool write(std::wstring name, void* value) = 0;
		/*
		* Je nachdem, welche Childclass kommt, wird value ein std::wstring oder DWORD
		*/
		virtual std::wstring getName() = 0;
};

class KeySZ : public Key
{
	private:
		std::wstring value;
	protected:
	public:
	bool write(std::wstring name, void* value);
	std::wstring getName()
	{
		return this-&gt;KeyName;
	}
};

bool KeySZ::write(std::wstring name, void* value)
{
	[...]
	LONG lRes = RegSetValueExW(this-&gt;hKey, name.c_str(),0,NULL,(const BYTE*)((std::wstring)value).c_str(),((std::wstring)value).length());
	[...]
}
</code></pre>
<p>Der Sinn meines Gedanken ist:</p>
<pre><code>typedef std::map&lt;std::wstring,Key&gt; MKey;

class RegTree
{
	public:
		typedef std::map&lt;std::wstring,RegTree&gt; MTree;
	private:
		MKey Keys;
		MTree Trees;
	[...]
};
</code></pre>
<p>Somit könnte ich einen Container erstellen, der alle drei Arten von RegKeys beinhaltet.</p>
<p>Hat jemand eine gute Idee das zu realisieren?</p>
<p>Mit freundlichen Grüßen<br />
Sepultura</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/324676/alternative-zu-void-c-11</link><generator>RSS for Node</generator><lastBuildDate>Tue, 14 Jul 2026 06:16:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/324676.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 26 Mar 2014 18:16:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Alternative zu void* ? C++11 on Wed, 26 Mar 2014 18:17:39 GMT]]></title><description><![CDATA[<p>Hallo Community ich möchte eine Registry Klasse machen.</p>
<p>Es gibt ja 3 Arten von ValueTypes in Registry:<br />
REG_SZ<br />
REG_DWORD<br />
REG_BINARY</p>
<p>und Abarten von diesen drei:<br />
REG_MULTI_SZ<br />
REG_EXPAND_SZ</p>
<p>so habe ich mir gedacht, dass ich es mit Abstrakter Klassen mache</p>
<pre><code>enum REG_TYPE
{
	REG_SZ,
	REG_DWORD,
	REG_BINARY
};

class Key
{
	private:
        protected:
		HKEY hKey;
		std::wstring path;
		std::wstring KeyName;

	public:
		virtual void* read() = 0;
		virtual bool write(std::wstring name, void* value) = 0;
		/*
		* Je nachdem, welche Childclass kommt, wird value ein std::wstring oder DWORD
		*/
		virtual std::wstring getName() = 0;
};

class KeySZ : public Key
{
	private:
		std::wstring value;
	protected:
	public:
	bool write(std::wstring name, void* value);
	std::wstring getName()
	{
		return this-&gt;KeyName;
	}
};

bool KeySZ::write(std::wstring name, void* value)
{
	[...]
	LONG lRes = RegSetValueExW(this-&gt;hKey, name.c_str(),0,NULL,(const BYTE*)((std::wstring)value).c_str(),((std::wstring)value).length());
	[...]
}
</code></pre>
<p>Der Sinn meines Gedanken ist:</p>
<pre><code>typedef std::map&lt;std::wstring,Key&gt; MKey;

class RegTree
{
	public:
		typedef std::map&lt;std::wstring,RegTree&gt; MTree;
	private:
		MKey Keys;
		MTree Trees;
	[...]
};
</code></pre>
<p>Somit könnte ich einen Container erstellen, der alle drei Arten von RegKeys beinhaltet.</p>
<p>Hat jemand eine gute Idee das zu realisieren?</p>
<p>Mit freundlichen Grüßen<br />
Sepultura</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2391357</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2391357</guid><dc:creator><![CDATA[Sepultura]]></dc:creator><pubDate>Wed, 26 Mar 2014 18:17:39 GMT</pubDate></item><item><title><![CDATA[Reply to Alternative zu void* ? C++11 on Wed, 26 Mar 2014 18:45:09 GMT]]></title><description><![CDATA[<p>Warum glaubst du, dass es eine gute Idee ist das Typsystem zu umgehen und Strings, Binärdaten und ints in einen Topf zu schmeißen? Da wirst du doch definitiv durcheinander kommen.<br />
KeySZ::write sollte einen string nehmen und keinen void *. Weiterhin würde ich die Vererbung komplett weglassen, das wird nur schaden. Wenn es denn sein muss, dann sollte KeySZ private von Key erben, damit die void <em>-Variante von write nicht benutzbar ist, die ist allein für die KeyBinary-Variante reserviert, wobei dafür noch ein Parameter für die Länge der void</em>-Daten fehlt.<br />
Warum willst du eigentlich Keys verschiedener Typen in eine map tun? Die kann man doch nicht vernünftig benutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2391362</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2391362</guid><dc:creator><![CDATA[nwp3]]></dc:creator><pubDate>Wed, 26 Mar 2014 18:45:09 GMT</pubDate></item><item><title><![CDATA[Reply to Alternative zu void* ? C++11 on Wed, 26 Mar 2014 18:46:45 GMT]]></title><description><![CDATA[<p>Wieso nicht einfach <code>key.readSZ()</code> usw.?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2391364</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2391364</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Wed, 26 Mar 2014 18:46:45 GMT</pubDate></item><item><title><![CDATA[Reply to Alternative zu void* ? C++11 on Wed, 26 Mar 2014 19:08:38 GMT]]></title><description><![CDATA[<p>nwp3 schrieb:</p>
<blockquote>
<p>Warum glaubst du, dass es eine gute Idee ist das Typsystem zu umgehen und Strings, Binärdaten und ints in einen Topf zu schmeißen? Da wirst du doch definitiv durcheinander kommen.<br />
KeySZ::write sollte einen string nehmen und keinen void *. Weiterhin würde ich die Vererbung komplett weglassen, das wird nur schaden. Wenn es denn sein muss, dann sollte KeySZ private von Key erben, damit die void <em>-Variante von write nicht benutzbar ist, die ist allein für die KeyBinary-Variante reserviert, wobei dafür noch ein Parameter für die Länge der void</em>-Daten fehlt.<br />
Warum willst du eigentlich Keys verschiedener Typen in eine map tun? Die kann man doch nicht vernünftig benutzen.</p>
</blockquote>
<p>Wenn ich die Vererbung entferne, müsste ich also 3 Key Container für RegTree machen.</p>
<p>Damit würden auch drei Iteratoren entstehen, um alle Keys nacheinander durchgehen zu können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2391370</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2391370</guid><dc:creator><![CDATA[Sepultura]]></dc:creator><pubDate>Wed, 26 Mar 2014 19:08:38 GMT</pubDate></item><item><title><![CDATA[Reply to Alternative zu void* ? C++11 on Wed, 26 Mar 2014 19:14:11 GMT]]></title><description><![CDATA[<p>Denk nicht in den Daten! Wenn du in Daten denkst, wird das nichts mit &quot;schönem&quot; C++ und du brauchst type erasure.<br />
Denk in Eigenschaften! Wenn du über die Keys iterierst, WAS musst du dann machen?<br />
Und das packst du in eine virtuelle Funktion.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2391371</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2391371</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Wed, 26 Mar 2014 19:14:11 GMT</pubDate></item><item><title><![CDATA[Reply to Alternative zu void* ? C++11 on Wed, 26 Mar 2014 19:46:37 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>wird das nichts mit &quot;schönem&quot; C++ und du brauchst type erasure.</p>
</blockquote>
<p>type erasure <em>ist</em> schönes C++.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2391378</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2391378</guid><dc:creator><![CDATA[theeraser]]></dc:creator><pubDate>Wed, 26 Mar 2014 19:46:37 GMT</pubDate></item><item><title><![CDATA[Reply to Alternative zu void* ? C++11 on Wed, 26 Mar 2014 19:55:05 GMT]]></title><description><![CDATA[<p>theeraser schrieb:</p>
<blockquote>
<p>Nathan schrieb:</p>
<blockquote>
<p>wird das nichts mit &quot;schönem&quot; C++ und du brauchst type erasure.</p>
</blockquote>
<p>type erasure <em>ist</em> schönes C++.</p>
</blockquote>
<p>Nein.<br />
Die Implementierung ist zwar herrlich ( <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="🙂"
    /> ), aber es ist kein schönes C++ im Anwendercode.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2391380</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2391380</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Wed, 26 Mar 2014 19:55:05 GMT</pubDate></item><item><title><![CDATA[Reply to Alternative zu void* ? C++11 on Wed, 26 Mar 2014 20:03:33 GMT]]></title><description><![CDATA[<p>Ihr meint, ich soll Templates verwenden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2391381</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2391381</guid><dc:creator><![CDATA[Sepultura]]></dc:creator><pubDate>Wed, 26 Mar 2014 20:03:33 GMT</pubDate></item><item><title><![CDATA[Reply to Alternative zu void* ? C++11 on Wed, 26 Mar 2014 20:55:24 GMT]]></title><description><![CDATA[<p>Sepultura schrieb:</p>
<blockquote>
<p>Ihr meint, ich soll Templates verwenden?</p>
</blockquote>
<p>Nein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2391384</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2391384</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Wed, 26 Mar 2014 20:55:24 GMT</pubDate></item><item><title><![CDATA[Reply to Alternative zu void* ? C++11 on Wed, 26 Mar 2014 21:11:22 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>Nein.<br />
Die Implementierung ist zwar herrlich ( <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="🙂"
    /> ), aber es ist kein schönes C++ im Anwendercode.</p>
</blockquote>
<p>Genau umgekehrt. Die Implementierung von Type Erasure braucht relativ viel Boilerplate-Code und bei komplexeren Dingen ziemliche TMP-Tricks, aber die Anwendung könnte kaum schöner sein.</p>
<p>Bestes Beispiel: <code>std::function</code><br />
Schlechteres Beispiel: <code>boost::any</code> -- nicht weil die Klasse nicht gut entwickelt ist, sondern weil Leute sie einsetzen ohne sie zu benötigen.</p>
<p>Was nicht gut ist, ist explizite Fallunterscheidung (switch, if-else, RTTI). Gut ist Polymorphie.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2391389</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2391389</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 26 Mar 2014 21:11:22 GMT</pubDate></item><item><title><![CDATA[Reply to Alternative zu void* ? C++11 on Wed, 26 Mar 2014 21:53:23 GMT]]></title><description><![CDATA[<p>Hallo</p>
<pre><code>KeySZ::KeySZ(HKEY root, std::wstring subkey, bool readonly)
{
	this-&gt;subkey = subkey;
	LONG lRes;
	if (readonly)
		lRes = RegOpenKeyExW(root, subkey.c_str(), 0, KEY_READ, &amp;this-&gt;hKey);
	else
		lRes = RegOpenKeyExW(root, subkey.c_str(), 0, KEY_ALL_ACCESS, &amp;this-&gt;hKey);
	if (lRes != ERROR_SUCCESS)
		throw &quot;COULD NOT OPEN&quot;;
	TCHAR buffer[512];
	RegQueryValueExW(this-&gt;hKey, TEXT(&quot;Installer Language&quot;), 0, 0, (BYTE*)buffer, (DWORD*)512);
	std::wcout &lt;&lt; buffer &lt;&lt; std::endl;
}
</code></pre>
<p>Ausgeführt wird der code so:</p>
<pre><code>KeySZ test(HKEY_CURRENT_USER, TEXT(&quot;Software\\pidgin&quot;), false);
</code></pre>
<p>Warum wirft RegQueryValueExW eine Zugriffsverletzung?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2391396</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2391396</guid><dc:creator><![CDATA[Sepultura]]></dc:creator><pubDate>Wed, 26 Mar 2014 21:53:23 GMT</pubDate></item><item><title><![CDATA[Reply to Alternative zu void* ? C++11 on Thu, 27 Mar 2014 00:05:02 GMT]]></title><description><![CDATA[<p>Sepultura schrieb:</p>
<blockquote>
<p>Alternative zu void* ? C++11</p>
</blockquote>
<p>WARUM?</p>
<p>Was willst Du erreichen? Welchen Zweck verfolgst Du? Für jeden Zweck können wir Dich totwerfen mit hunderten von Lösungen, die ihrerseits je nach anderem Zweck besser oder schlechter wären.</p>
<p>Viele von uns wollen einfach nicht glauben, daß Du die Windows-Registry nachbilden willst. Die kommt nämlich direkt aus der Hölle.</p>
<p>Mach am besten, was Nathan und Nexus sagen. Die sind mir in vielen bisherigen Threads saupositiv aufgefallen, wie sie schwach anfangen und sich miteinander aufs Optimum aufschaukeln und nicht jemanden belästigend &quot;belehren&quot;, sondern einfach helfen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>Außer hier gerade mal. Nuja, passiert.<br />
Passiert mich auch (jetzt nämlich zum Beispiel!). Kannst die Registry nicht sinnvoll abbilden. &quot;'Ääätsch!&quot;. Kannst aber schon irgendwelche Proxy-Objekte da ablegen und holen. Mehr aber nicht bitte. Und die schon sind zu objektorientiert. Lass es doch einfach bei den Zugriffsfunktionen. Die kannste ein wenig schmirgeln bei Bedarf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2391409</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2391409</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 27 Mar 2014 00:05:02 GMT</pubDate></item><item><title><![CDATA[Reply to Alternative zu void* ? C++11 on Thu, 27 Mar 2014 11:17:59 GMT]]></title><description><![CDATA[<p>Sepultura schrieb:</p>
<blockquote>
<pre><code>KeySZ::KeySZ(HKEY root, std::wstring subkey, bool readonly)
{
	this-&gt;subkey = subkey;
	LONG lRes;
	if (readonly)
		lRes = RegOpenKeyExW(root, subkey.c_str(), 0, KEY_READ, &amp;this-&gt;hKey);
	else
		lRes = RegOpenKeyExW(root, subkey.c_str(), 0, KEY_ALL_ACCESS, &amp;this-&gt;hKey);
	if (lRes != ERROR_SUCCESS)
		throw &quot;COULD NOT OPEN&quot;;
	TCHAR buffer[512];
	RegQueryValueExW(this-&gt;hKey, TEXT(&quot;Installer Language&quot;), 0, 0, (BYTE*)buffer, (DWORD*)512);
	std::wcout &lt;&lt; buffer &lt;&lt; std::endl;
}
</code></pre>
<p>Ausgeführt wird der code so:</p>
<pre><code>KeySZ test(HKEY_CURRENT_USER, TEXT(&quot;Software\\pidgin&quot;), false);
</code></pre>
<p>Warum wirft RegQueryValueExW eine Zugriffsverletzung?</p>
</blockquote>
<p>Wahrscheinlich weil dort</p>
<pre><code>RegQueryValueExW( ..., (DWORD*)512);
</code></pre>
<p>steht. Hat der Compiler dort keine Warnung ausgeworfen? Dort lässt Du die Funktion auf ein Stück Speicher an der Adresse 512 zugreifen.<br />
Du meinst sicher:</p>
<pre><code>DWORD len = 512;
	RegQueryValueExW(this-&gt;hKey, TEXT(&quot;Installer Language&quot;), 0, 0, (BYTE*)buffer, &amp;len);
</code></pre>
<p>Und vergesse nicht, den Returnwert der Funktion auszuwerten!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2391459</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2391459</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Thu, 27 Mar 2014 11:17:59 GMT</pubDate></item><item><title><![CDATA[Reply to Alternative zu void* ? C++11 on Thu, 27 Mar 2014 14:36:42 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Nathan schrieb:</p>
<blockquote>
<p>Nein.<br />
Die Implementierung ist zwar herrlich ( <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="🙂"
    /> ), aber es ist kein schönes C++ im Anwendercode.</p>
</blockquote>
<p>Genau umgekehrt. Die Implementierung von Type Erasure braucht relativ viel Boilerplate-Code und bei komplexeren Dingen ziemliche TMP-Tricks</p>
</blockquote>
<p>Sagte ich doch: schönes C++. :p<br />
Ich persönlich liebe es solche Probleme mit allen verfügbaren Mitteln zu lösen, ob es nun TMP-Hacks, Makros oder ähnliches ist.</p>
<blockquote>
<p>, aber die Anwendung könnte kaum schöner sein.<br />
Bestes Beispiel: <code>std::function</code></p>
</blockquote>
<p>Stimmt, an std::function hab ich gar nicht gedacht. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<blockquote>
<p>Schlechteres Beispiel: <code>boost::any</code> -- nicht weil die Klasse nicht gut entwickelt ist, sondern weil Leute sie einsetzen ohne sie zu benötigen.<br />
Was nicht gut ist, ist explizite Fallunterscheidung (switch, if-else, RTTI). Gut ist Polymorphie.</p>
</blockquote>
<p>Das Beispiel hatte ich im Sinn als ich schlechte Anwendung meinte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2391489</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2391489</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Thu, 27 Mar 2014 14:36:42 GMT</pubDate></item></channel></rss>