<?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[boolscher Operator]]></title><description><![CDATA[<p>Ich möchte gerne bei einem eigenem Datentyp den Operator überladen, der ermöglicht, das gesamte Objekt einfach in einer If-Abfrage zu überprüfen. Also</p>
<pre><code class="language-cpp">class Klasse{int a; int b;};
Klasse Objekt;

if(Objekt)
{
//...
}
</code></pre>
<p>Nur habe ich keine Ahnung, welcher das sein könnte, ja noch nicht mal, ob es überhaupt einen solchen gibt...</p>
<p>Mit operator!() hat ja zumindest mal das Gegenteil geklappt, also kanns ja nicht unmöglich sein....</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/119719/boolscher-operator</link><generator>RSS for Node</generator><lastBuildDate>Sat, 22 Aug 2026 01:26:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/119719.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 05 Sep 2005 06:07:31 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to boolscher Operator on Mon, 05 Sep 2005 06:07:31 GMT]]></title><description><![CDATA[<p>Ich möchte gerne bei einem eigenem Datentyp den Operator überladen, der ermöglicht, das gesamte Objekt einfach in einer If-Abfrage zu überprüfen. Also</p>
<pre><code class="language-cpp">class Klasse{int a; int b;};
Klasse Objekt;

if(Objekt)
{
//...
}
</code></pre>
<p>Nur habe ich keine Ahnung, welcher das sein könnte, ja noch nicht mal, ob es überhaupt einen solchen gibt...</p>
<p>Mit operator!() hat ja zumindest mal das Gegenteil geklappt, also kanns ja nicht unmöglich sein....</p>
]]></description><link>https://www.c-plusplus.net/forum/post/865057</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/865057</guid><dc:creator><![CDATA[HEZ]]></dc:creator><pubDate>Mon, 05 Sep 2005 06:07:31 GMT</pubDate></item><item><title><![CDATA[Reply to boolscher Operator on Mon, 05 Sep 2005 06:29:49 GMT]]></title><description><![CDATA[<p>Wie wäre es mit einem benutzerdefinierten Konvertierungsoperator für den Typ bool?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/865067</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/865067</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Mon, 05 Sep 2005 06:29:49 GMT</pubDate></item><item><title><![CDATA[Reply to boolscher Operator on Mon, 05 Sep 2005 06:39:50 GMT]]></title><description><![CDATA[<p>Oha... ich war so fixiert darauf, rauszufinden welches der Operatorzeichen denn nun dafür passen könnte, dass ich die Konversionsfunktionen vollkommen ausser Acht gelassen habe. Vielen Dank, hast mir sehr weiter geholfen! <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>
]]></description><link>https://www.c-plusplus.net/forum/post/865073</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/865073</guid><dc:creator><![CDATA[HEZ]]></dc:creator><pubDate>Mon, 05 Sep 2005 06:39:50 GMT</pubDate></item><item><title><![CDATA[Reply to boolscher Operator on Mon, 05 Sep 2005 06:58:53 GMT]]></title><description><![CDATA[<p>MFK schrieb:</p>
<blockquote>
<p>Wie wäre es mit einem benutzerdefinierten Konvertierungsoperator für den Typ bool?</p>
</blockquote>
<p>Lieber nicht... damit wird ein Objekt der Klasse mit so ziemlich allem und extrem unkontrolliert vergleichbar.<br />
Die IOstreams machen das (mit gutem Grund) über operator void*. Ich persönlich halte Abfragen wie <em>if( objekt)</em> nur für Schreibfaulheit, die man mit einer gut benannten Methode viel besser ersetzen könnte.</p>
<p>~Edit: deutsche Sprache schwere Sprache =)~</p>
]]></description><link>https://www.c-plusplus.net/forum/post/865074</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/865074</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Mon, 05 Sep 2005 06:58:53 GMT</pubDate></item><item><title><![CDATA[Reply to boolscher Operator on Mon, 05 Sep 2005 06:45:21 GMT]]></title><description><![CDATA[<p>Unkontrolliert vergleichbar? Bei bool könnte doch da nicht viel passieren? Gibt ja schließlich nur zwei Zustände, wenn man jetzt den Operator mit einer anderen bool-Variable vergleicht, ist es ja nicht so, als ob eine Übereinstimmung besteht, obwohl sich die Inhalte widersprechen...</p>
<p>operator void* ... ich stehe ja eigentlich nicht so auf void-Zeiger... da lässt sich doch noch viel mehr Wahnsinn zuweisen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/865077</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/865077</guid><dc:creator><![CDATA[HEZ]]></dc:creator><pubDate>Mon, 05 Sep 2005 06:45:21 GMT</pubDate></item><item><title><![CDATA[Reply to boolscher Operator on Mon, 05 Sep 2005 06:52:47 GMT]]></title><description><![CDATA[<p>HEZ schrieb:</p>
<blockquote>
<p>Unkontrolliert vergleichbar? Bei bool könnte doch da nicht viel passieren? Gibt ja schließlich nur zwei Zustände, wenn man jetzt den Operator mit einer anderen bool-Variable vergleicht, ist es ja nicht so, als ob eine Übereinstimmung besteht, obwohl sich die Inhalte widersprechen...</p>
</blockquote>
<p>Das ist nicht das Problem. Das Problem ist, dass ziemlich viele Dinge implizit in bool konvertierbar sind. Damit bastelt dir der Compiler aus den wildesten Konstrukten, die sonst womöglich eine Fehlermeldung erzeugen würden, irgendetwas hin, das diesen Operator benutzt.</p>
<blockquote>
<p>operator void* ... ich stehe ja eigentlich nicht so auf void-Zeiger... da lässt sich doch noch viel mehr Wahnsinn zuweisen?</p>
</blockquote>
<p>Mit einem void* kannst du (implizit) nicht viel mehr machen als ihn auf != 0 zu prüfen. Zuweisen kannst du da sowieso nichts. 7H3 N4C3R hat mit seinem Einwand recht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/865081</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/865081</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Mon, 05 Sep 2005 06:52:47 GMT</pubDate></item><item><title><![CDATA[Reply to boolscher Operator on Mon, 05 Sep 2005 06:56:45 GMT]]></title><description><![CDATA[<p>Hmm du kannst mal überlegen, wieviel implizit nach void* und wieviel implizit nach bool castet - und wie sich das dann auf die Vergleichbarkeit deiner Klasse auswirkt. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
Mit operator bool() ist deine Klasse (zwar nicht sinnvoll aber trotzdem) mit so ziemlich allen eingebauten Datentypen vergleichbar. Willst Du das wirklich?</p>
<p>Edit: Hm da war MFK schneller <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>
]]></description><link>https://www.c-plusplus.net/forum/post/865089</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/865089</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Mon, 05 Sep 2005 06:56:45 GMT</pubDate></item><item><title><![CDATA[Reply to boolscher Operator on Mon, 05 Sep 2005 07:02:32 GMT]]></title><description><![CDATA[<p>Naja, ich kann jetzt zwar nicht behaupten, dass ich die Begründung verstehe, aber wenn ihr euch einig seid, muss es ja stimmen. <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="😃"
    /> Irgenwann werde ich es nachvollziehen können und bis dahin werde ich mich einfach an diese Anweisung halten. (Habe ich bei &quot;Public-Variablen sind böse&quot; auch einfach gemacht und später kapiert.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/865097</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/865097</guid><dc:creator><![CDATA[HEZ]]></dc:creator><pubDate>Mon, 05 Sep 2005 07:02:32 GMT</pubDate></item><item><title><![CDATA[Reply to boolscher Operator on Mon, 05 Sep 2005 07:46:44 GMT]]></title><description><![CDATA[<p>Habe es jetzt so umgesetzt:</p>
<pre><code class="language-cpp">TToolTnc::WZ_Var::operator void*()
{
  if(this-&gt;VarName.IsEmpty() &amp;&amp; this-&gt;Value.IsEmpty())
    return NULL;
  else 
    return this;
}
</code></pre>
<p>Habs jetzt direkt aus dem Code genommen und kein Beispiel gebastelt, weil man wohl erkennen kann, worums geht.</p>
<p>Nun, es erscheint mir so ein wenig komisch, schließlich liegt das Objekt ja nicht tatsächlich auf NULL. Aber wenn ich stattdessen versuche, einem Objekt NULL zuzuweisen, damit der Operator korrekte Werte zurückgibt, bekomme ich nen Konvertierungsfehler. Jetzt könnte ich da auch einen Zuweisungsoperator hinwurschteln, aber dann könnte man schon wieder jeden Müll zuweisen.</p>
<p>Wo liegt denn diesmal mein Denkfehler?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/865127</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/865127</guid><dc:creator><![CDATA[HEZ]]></dc:creator><pubDate>Mon, 05 Sep 2005 07:46:44 GMT</pubDate></item><item><title><![CDATA[Reply to boolscher Operator on Mon, 05 Sep 2005 07:55:53 GMT]]></title><description><![CDATA[<p>HEZ schrieb:</p>
<blockquote>
<p>Aber wenn ich stattdessen versuche, einem Objekt NULL zuzuweisen, damit der Operator korrekte Werte zurückgibt,</p>
</blockquote>
<p>Wozu &quot;korrekte Werte&quot;? void* ist hier nur eine Krücke, damit du eine möglichst kontrollierte Umwandlung nach bool hinbekommst. Der Zeiger ist nur für Vergleiche mit 0 vorgesehen, nicht, um damit auf das Objekt zuzugreifen. Der Zeiger muss daher auch nichts mit der Adresse des Objekts zu tun haben. Du musst nicht this zurückgeben, jeder andere von 0 verschiedene Zeiger tut's auch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/865131</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/865131</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Mon, 05 Sep 2005 07:55:53 GMT</pubDate></item><item><title><![CDATA[Reply to boolscher Operator on Mon, 05 Sep 2005 08:25:28 GMT]]></title><description><![CDATA[<p>Na gut. Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/865165</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/865165</guid><dc:creator><![CDATA[HEZ]]></dc:creator><pubDate>Mon, 05 Sep 2005 08:25:28 GMT</pubDate></item><item><title><![CDATA[Reply to boolscher Operator on Mon, 05 Sep 2005 08:27:48 GMT]]></title><description><![CDATA[<p>HEZ schrieb:</p>
<blockquote>
<p>operator void* ... ich stehe ja eigentlich nicht so auf void-Zeiger... da lässt sich doch noch viel mehr Wahnsinn zuweisen?</p>
</blockquote>
<p>Nunja, eigentlich kannst du nur andere Zeiger damit vergleichen. Du kannst es aber auch vollkommen idiotensicher machen. Dazu nimmst du eine simple Klasse, zB:</p>
<pre><code class="language-cpp">class safe_bool
{
public:
	typedef void (safe_bool::*type)();
	static type value(bool source)
	{
		return source ? &amp;safe_bool::non_null : NULL;
	}
private:
	void non_null()
	{
	}
};
</code></pre>
<p>Die Verwendung sieht dann wie folgt aus:</p>
<pre><code class="language-cpp">operator safe_bool::type() const
{
	return safe_bool::value(!this-&gt;VarName.IsEmpty() || !this-&gt;Value.IsEmpty());
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/865168</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/865168</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Mon, 05 Sep 2005 08:27:48 GMT</pubDate></item><item><title><![CDATA[Reply to boolscher Operator on Mon, 05 Sep 2005 08:38:25 GMT]]></title><description><![CDATA[<p>[cpp]<br />
class safe_bool<br />
{<br />
public:<br />
typedef void (safe_bool::*type)();<br />
[cpp]<br />
sag mir ma, wie groß sizeof type ist. nicht schätzen. miss mal.</p>
<blockquote>
<p>void non_null()<br />
{<br />
}</p>
</blockquote>
<p>diese funktion wird leider generiert, weil da jemand von die adresse gezogen hat. ich würde lieber reinterpret_cast nehmen als sowas.<br />
warum nicht this? das liegt doch eh im register cx und mit mov ax,cx breicht man nur einen takt, um this als returnwert zu haben.</p>
<p>außerdem würde ich nen zeiger auf nen typen zurückgeben. auf struct NoType{}; vielleicht. der ist dann eh nur mit 0 vergleichbar, aber das macht nix.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/865174</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/865174</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 05 Sep 2005 08:38:25 GMT</pubDate></item><item><title><![CDATA[Reply to boolscher Operator on Mon, 05 Sep 2005 11:09:42 GMT]]></title><description><![CDATA[<p>richtig: messen<br />
folgendes kleine program zum demonstrieren:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
struct foo
{
	void bar() const {}
	typedef void (foo::*safe_bool)() const;
	struct bar2 {};
	static const bar2 b;
	operator bool() const { return m &lt; RAND_MAX / 2; }
//	operator const void*() const { return m &lt; RAND_MAX / 2 ? this : 0; }
//	operator const bar2*() const { return m &lt; RAND_MAX / 2 ? &amp;b : 0; }
//	operator safe_bool() const { return m &lt; RAND_MAX / 2 ? &amp;foo::bar : 0; }
	int m;
};
const foo::bar2 foo::b;
unsigned rdtsc() { __asm rdtsc }
int main()
{
	using namespace std;
	foo a;
	srand( rdtsc() );
	a.m = rand();
	if ( a )
		cout &lt;&lt; &quot;true&quot;;
	else
		cout &lt;&lt; &quot;false&quot;;
}
</code></pre>
<p>das ganze compiliert mit vc++ 7.1 mit allen optimierungenergibt:</p>
<pre><code>21: 	a.m = rand();
0040101B E8 70 29 00 00   call        rand (403990h) 
    22: 	if ( a )
00401020 3D FF 3F 00 00   cmp         eax,3FFFh 
00401025 7D 13            jge         main+2Ah (40103Ah) 
    23: 		cout &lt;&lt; &quot;true&quot;;
00401027 68 28 C1 40 00   push        offset string &quot;true&quot; (40C128h)
</code></pre>
<p>mit operator const void*:</p>
<pre><code>21: 	a.m = rand();
0040101C E8 7F 29 00 00   call        rand (4039A0h) 
    22: 	if ( a )
00401021 33 C9            xor         ecx,ecx 
00401023 3D FF 3F 00 00   cmp         eax,3FFFh 
00401028 0F 9D C1         setge       cl   
0040102B 8D 14 24         lea         edx,[esp] 
0040102E 83 E9 01         sub         ecx,1 
00401031 85 CA            test        edx,ecx 
00401033 74 14            je          main+39h (401049h) 
    23: 		cout &lt;&lt; &quot;true&quot;;
00401035 68 28 C1 40 00   push        offset string &quot;true&quot; (40C128h)
</code></pre>
<p>mit operator const bar2*</p>
<pre><code>21: 	a.m = rand();
0040101B E8 80 29 00 00   call        rand (4039A0h) 
    22: 	if ( a )
00401020 33 C9            xor         ecx,ecx 
00401022 3D FF 3F 00 00   cmp         eax,3FFFh 
00401027 0F 9D C1         setge       cl   
0040102A 83 E9 01         sub         ecx,1 
0040102D F7 C1 1C C1 40 00 test        ecx,offset foo::b (40C11Ch) 
00401033 74 13            je          main+38h (401048h) 
    23: 		cout &lt;&lt; &quot;true&quot;;
00401035 68 28 C1 40 00   push        offset string &quot;true&quot; (40C128h)
</code></pre>
<p>und mit operator safe_bool:</p>
<pre><code>21: 	a.m = rand();
0040102B E8 80 29 00 00   call        rand (4039B0h) 
    22: 	if ( a )
00401030 33 C9            xor         ecx,ecx 
00401032 3D FF 3F 00 00   cmp         eax,3FFFh 
00401037 0F 9D C1         setge       cl   
0040103A 83 E9 01         sub         ecx,1 
0040103D F7 C1 00 10 40 00 test        ecx,offset foo::bar (401000h) 
00401043 74 13            je          main+38h (401058h) 
    23: 		cout &lt;&lt; &quot;true&quot;;
00401045 68 28 C1 40 00   push        offset string &quot;true&quot; (40C128h)
</code></pre>
<p>nun sieht das mit einem anderen compiler sicher anders aus.<br />
bleibt festzuhalten: nur operator bool() wird optimal übersetzt - das problem ist hier aber, dass der compiler sich nicht bewusst ist, dass benannte objekte niemals die adresse 0 haben können. das lässt sich heilen - allerdings nicht gänzlich standardkonform (da pointer auch trapvalues haben können):<br />
mit</p>
<pre><code class="language-cpp">operator const void*() const { return m &lt; RAND_MAX / 2 ? (const void*)1 : 0; }
</code></pre>
<p>erhalte ich:</p>
<pre><code>31: 	a.m = rand();
0040101B E8 70 29 00 00   call        rand (403990h) 
    32: 	if ( a )
00401020 3D FF 3F 00 00   cmp         eax,3FFFh 
00401025 7D 13            jge         main+2Ah (40103Ah) 
    33: 		cout &lt;&lt; &quot;true&quot;;
00401027 68 28 C1 40 00   push        offset string &quot;true&quot; (40C128h)
</code></pre>
<p>wunderbar. das ganze geht auch für memberfuntionpointer:</p>
<pre><code class="language-cpp">operator safe_bool() const
	{
		union
		{
			unsigned x;
			safe_bool result;
		} result = { m &lt; RAND_MAX / 2 };
		return result.result;
	}
</code></pre>
<pre><code>31: 	a.m = rand();
0040101B E8 70 29 00 00   call        rand (403990h) 
    32: 	if ( a )
00401020 3D FF 3F 00 00   cmp         eax,3FFFh 
00401025 7D 13            jge         main+2Ah (40103Ah) 
    33: 		cout &lt;&lt; &quot;true&quot;;
00401027 68 28 C1 40 00   push        offset string &quot;true&quot; (40C128h)
</code></pre>
<p>sehr schön. da jetzt auch bezug auf bar::foo() mehr genommen wird spart man diese 16 byte (1 byte function, 15 byte für ausrichtung des einsprungpunktes, so sinnlos das hier auch ist) auch noch ein.</p>
<p>fazit: mit ein paar tricks kann jede form optimalen code liefern. memberfunctionspointer sind dann aber am sichersten, denn auch mit bar* kann man noch viele unsinnige sachen wie pointerarithmetik betreiben (es sei denn, bar ist ein unvollständiger typ, aber dann muss man auch wieder einen hack wie oben benutzen, um ein bar* zurückliefern zu können). ausserdem ist sowohl bar* als auch void* mit jedem anderen void* pointer vergleichbar.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/865305</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/865305</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 05 Sep 2005 11:09:42 GMT</pubDate></item><item><title><![CDATA[Reply to boolscher Operator on Mon, 05 Sep 2005 13:48:00 GMT]]></title><description><![CDATA[<p>groovemaster schrieb:</p>
<blockquote>
<p>Nunja, eigentlich kannst du nur andere Zeiger damit vergleichen. Du kannst es aber auch vollkommen idiotensicher machen. Dazu nimmst du eine simple Klasse, zB:</p>
</blockquote>
<p>Also nehmen wir mal eine Klasse MeinStream, deren Zustand mit operator safe_bool überprüfbar ist, und eine Klasse Farbe, deren safe_bool &quot;true&quot; ergibt, wenn die Farbe nicht unsichtbar ist, und wir bekommen</p>
<pre><code class="language-cpp">void doBockmist(MeinStream&amp; a, Farbe&amp; b)
{
    if (a == b) ...;
}
</code></pre>
<p>Boost bietet doch afaik eine safe_bool-Bibliothek an - ich würde mich einfach mal darauf verlassen, dass das da einigermaßen vernünftig gelöst ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/865439</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/865439</guid><dc:creator><![CDATA[operator void]]></dc:creator><pubDate>Mon, 05 Sep 2005 13:48:00 GMT</pubDate></item><item><title><![CDATA[Reply to boolscher Operator on Mon, 05 Sep 2005 14:57:00 GMT]]></title><description><![CDATA[<blockquote>
<p>safe_bool überprüfbar ist, und eine Klasse Farbe, deren safe_bool &quot;true&quot; ergibt, wenn die Farbe nicht unsichtbar ist, und wir bekommen</p>
<pre><code class="language-cpp">void doBockmist(MeinStream&amp; a, Farbe&amp; b)
{
    if (a == b) ...;
}
</code></pre>
</blockquote>
<p>das ist auch sinnvoller code.<br />
der sagt &quot;wenn a den gleichen gültigkeitswert hat wie b&quot;. null probleme und sinnvoll.<br />
es gibt darum, daß man nicht bei<br />
cout&lt;&lt;a; vom rechner &quot;true&quot; erzählt kriegt, sondern das richtige &quot;ätsch, ich kann gar keinen MeinStream ausgeben&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/865530</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/865530</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 05 Sep 2005 14:57:00 GMT</pubDate></item><item><title><![CDATA[Reply to boolscher Operator on Mon, 05 Sep 2005 17:35:20 GMT]]></title><description><![CDATA[<p>So kann mans natürlich auch interpretieren. Ich finde das eine sehr verwirrende Benutzung des operator==, andererseits würde ich auch nie auf die Idee kommen, irgendeine spezielle Eigenschaft meines Objekts per if (obj) abzufragen. Ich bin dann eher der &quot;bool isXyz() const&quot;-Typ, glaube ich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/865650</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/865650</guid><dc:creator><![CDATA[operator void]]></dc:creator><pubDate>Mon, 05 Sep 2005 17:35:20 GMT</pubDate></item><item><title><![CDATA[Reply to boolscher Operator on Mon, 05 Sep 2005 18:20:44 GMT]]></title><description><![CDATA[<p>operator void schrieb:</p>
<blockquote>
<p>So kann mans natürlich auch interpretieren. Ich finde das eine sehr verwirrende Benutzung des operator==, andererseits würde ich auch nie auf die Idee kommen, irgendeine spezielle Eigenschaft meines Objekts per if (obj) abzufragen. Ich bin dann eher der &quot;bool isXyz() const&quot;-Typ, glaube ich.</p>
</blockquote>
<p>naja, jeder wird wohl irgendwann sowas gemacht haben:</p>
<pre><code class="language-cpp">Object* p=foo();
if(p){
    ....
}
</code></pre>
<p>wieso dann nicht auch so?</p>
<pre><code class="language-cpp">SmartPointer&lt;Object&gt; p=foo();
if(p){
    ....
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/865682</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/865682</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Mon, 05 Sep 2005 18:20:44 GMT</pubDate></item><item><title><![CDATA[Reply to boolscher Operator on Mon, 05 Sep 2005 18:31:05 GMT]]></title><description><![CDATA[<p>Mache ich, weil es geht und idiomatisch ist. Im Prinzip halte ichs da aber eher mit Java/C# <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>
]]></description><link>https://www.c-plusplus.net/forum/post/865692</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/865692</guid><dc:creator><![CDATA[operator void]]></dc:creator><pubDate>Mon, 05 Sep 2005 18:31:05 GMT</pubDate></item><item><title><![CDATA[Reply to boolscher Operator on Tue, 06 Sep 2005 08:34:28 GMT]]></title><description><![CDATA[<p>OMG, ich hatte wohl übersehen, dass ich im Assembler-Forum bin. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> <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="🙄"
    /><br />
Vielleicht hätte ich dazu schreiben sollen, dass es für Leute, die im Mikrobereich optimieren, andere Möglichkeiten gibt. Das Beispiel war einzig und allein für Codesicherheit gedacht.</p>
<p>volkard schrieb:</p>
<blockquote>
<p>sag mir ma, wie groß sizeof type ist</p>
</blockquote>
<p>Wozu? Stört dich der Member-Funktionszeiger? Den kann man natürlich noch eliminieren.</p>
<pre><code class="language-cpp">class safe_bool
{
private:
	struct closed
	{
	};
public:
	typedef void (*type)(closed);
	static type value(bool source)
	{
		return source ? &amp;safe_bool::non_null : NULL;
	}
private:
	static void non_null(closed)
	{
	}
};
</code></pre>
<p>volkard schrieb:</p>
<blockquote>
<p>warum nicht this?</p>
</blockquote>
<p>Weil ich in einer Non-Memberfunktion nunmal kein this habe. Ich bin aber schon gespannt auf ein Beispiel von dir.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/865950</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/865950</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Tue, 06 Sep 2005 08:34:28 GMT</pubDate></item><item><title><![CDATA[Reply to boolscher Operator on Tue, 06 Sep 2005 09:03:04 GMT]]></title><description><![CDATA[<p>groovemaster schrieb:</p>
<blockquote>
<p>volkard schrieb:</p>
<blockquote>
<p>sag mir ma, wie groß sizeof type ist</p>
</blockquote>
<p>Wozu? Stört dich der Member-Funktionszeiger?</p>
</blockquote>
<p>8 oder 12 bytes. nicht 4, und damit schmerzhaft.</p>
<blockquote>
<p>Den kann man natürlich noch eliminieren.</p>
<pre><code class="language-cpp">class safe_bool
{
private:
	struct closed
	{
	};
public:
	typedef void (*type)(closed);
	static type value(bool source)
	{
		return source ? &amp;safe_bool::non_null : NULL;
	}
private:
	static void non_null(closed)
	{
	}
};
</code></pre>
</blockquote>
<p>der vorteil deines member-zeugs war wohl, daß man die sehr schwer aus versehen casten kann.<br />
einen möglichen fehler sehe ich sogar. man hantiert mit zeigern und placement-new. und das will nen void*. und man steckt nen safe_bool rein.<br />
wird der aktuelle normale funktionszeiger nicht von allein in nen void* konvertiert?</p>
<p>volkard schrieb:</p>
<blockquote>
<p>warum nicht this?</p>
</blockquote>
<p>Weil ich in einer Non-Memberfunktion nunmal kein this habe. Ich bin aber schon gespannt auf ein Beispiel von dir.[/quote]<br />
satic zu nehmen ist neu.<br />
mir scheint, reinterpret_cast muß her.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/865976</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/865976</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 06 Sep 2005 09:03:04 GMT</pubDate></item><item><title><![CDATA[Reply to boolscher Operator on Tue, 06 Sep 2005 09:15:08 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>der vorteil deines member-zeugs war wohl, daß man die sehr schwer aus versehen casten kann.</p>
</blockquote>
<p>Yep.</p>
<p>volkard schrieb:</p>
<blockquote>
<p>einen möglichen fehler sehe ich sogar. man hantiert mit zeigern und placement-new. und das will nen void*. und man steckt nen safe_bool rein.<br />
wird der aktuelle normale funktionszeiger nicht von allein in nen void* konvertiert?</p>
</blockquote>
<p>An das implizite Casten nach void* hab ich jetzt beim zweiten Beispiel gar nicht mal gedacht. Aber ein weiterer Grund, weshalb ich wohl beim Member-Funktionszeiger bleiben werden.</p>
<p>volkard schrieb:</p>
<blockquote>
<blockquote>
<p>volkard schrieb:</p>
<blockquote>
<p>warum nicht this?</p>
</blockquote>
<p>Weil ich in einer Non-Memberfunktion nunmal kein this habe. Ich bin aber schon gespannt auf ein Beispiel von dir.</p>
</blockquote>
<p>satic zu nehmen ist neu.<br />
mir scheint, reinterpret_cast muß her.</p>
</blockquote>
<p>Ich bin immer noch auf Code von dir gespannt. Ich habe es nicht geschafft, gültigen Code mit this zu schreiben, da dies auch mein erster Ansatz war. Allerdings habe ich nicht allzu viel Zeit darin investiert, um sagen zu können, alle Fälle abgecheckt zu haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/865992</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/865992</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Tue, 06 Sep 2005 09:15:08 GMT</pubDate></item></channel></rss>