<?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[Funktion mit Rückgabe-Objekt, das nicht ignoriert werden kann]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich stehe vor einem Problem, dass mir ein wenig Kopf zerbrechen bereitet. Ich möchte eine Methode / Funktion haben, die mir ein Objekt zurückgibt - und wenn man dieses ignoriert, soll es einen Compile-Fehler geben.</p>
<p>Beispiel:</p>
<pre><code class="language-cpp">TransactionWatchDog hasso = startTransaction(); // ok
startTransaction(); // Fehler
</code></pre>
<p>Warum das ganze? Das Objekt, was zurückgegeben wird, soll automatisch ein Commit oder Rollback machen, wenn es aus dem Scope läuft. Da das Commit aber sofort passiert, wenn man den Rückgabewert ignoriert, soll es in diesem Fall einen Compilefehler geben.</p>
<p>Gebraucht wird das ganze, um das Exception-Handling zu vereinfachen und um händische Aufrufe von start/commit/rollback (und damit potenzielle Programmierfehler) zu vermeiden. Der Benutzer soll aber nichts weiter über die Konstruktion dieses Watchdogs wissen (feste Anforderung) (in diesem Fall könnte man nämlich den Watchdog erzeugen und per Referenz übergeben). TransactionWatchDog muss dabei keine konkrete Klasse sein, sondern auch ruhig ein typedef wie const MyMagicClass&amp; oder von mir aus sogar ein Define sein.</p>
<p>Meine Frage ist - ist das so wie ich mir das vorstelle, überhaupt möglich? Laufzeitprüfung wäre nicht das Problem, aber eben die Compilezeit-Prüfung. Ich habe an Sachen mit Proxies und privaten friend Destruktoren gedacht, aber bis jetzt bin ich zu keiner Lösung gekommen. Konstruktive Ideen wären toll <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>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/131536/funktion-mit-rückgabe-objekt-das-nicht-ignoriert-werden-kann</link><generator>RSS for Node</generator><lastBuildDate>Thu, 27 Aug 2026 04:06:22 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/131536.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 04 Jan 2006 11:24:15 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Funktion mit Rückgabe-Objekt, das nicht ignoriert werden kann on Wed, 04 Jan 2006 11:24:15 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich stehe vor einem Problem, dass mir ein wenig Kopf zerbrechen bereitet. Ich möchte eine Methode / Funktion haben, die mir ein Objekt zurückgibt - und wenn man dieses ignoriert, soll es einen Compile-Fehler geben.</p>
<p>Beispiel:</p>
<pre><code class="language-cpp">TransactionWatchDog hasso = startTransaction(); // ok
startTransaction(); // Fehler
</code></pre>
<p>Warum das ganze? Das Objekt, was zurückgegeben wird, soll automatisch ein Commit oder Rollback machen, wenn es aus dem Scope läuft. Da das Commit aber sofort passiert, wenn man den Rückgabewert ignoriert, soll es in diesem Fall einen Compilefehler geben.</p>
<p>Gebraucht wird das ganze, um das Exception-Handling zu vereinfachen und um händische Aufrufe von start/commit/rollback (und damit potenzielle Programmierfehler) zu vermeiden. Der Benutzer soll aber nichts weiter über die Konstruktion dieses Watchdogs wissen (feste Anforderung) (in diesem Fall könnte man nämlich den Watchdog erzeugen und per Referenz übergeben). TransactionWatchDog muss dabei keine konkrete Klasse sein, sondern auch ruhig ein typedef wie const MyMagicClass&amp; oder von mir aus sogar ein Define sein.</p>
<p>Meine Frage ist - ist das so wie ich mir das vorstelle, überhaupt möglich? Laufzeitprüfung wäre nicht das Problem, aber eben die Compilezeit-Prüfung. Ich habe an Sachen mit Proxies und privaten friend Destruktoren gedacht, aber bis jetzt bin ich zu keiner Lösung gekommen. Konstruktive Ideen wären toll <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>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/956452</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/956452</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Wed, 04 Jan 2006 11:24:15 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion mit Rückgabe-Objekt, das nicht ignoriert werden kann on Wed, 04 Jan 2006 11:36:37 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">template &lt;typename T&gt;
class ReturnedObject
{
public:
    ReturnedObject (T obj) : _obj (obj), _used (false) {}
    operator T ()
    {
        _used = true;
        return obj;
    }
    ~ReturnedObject ()
    {
        if (!_used) throw Error;
    }
private:
    T _obj;
    bool _used;
}

ReturnedObject&lt;int&gt; do_something ()
{
    return 5;
}
</code></pre>
<p>Sowas?</p>
<p>/Edit: izz, nicht zu ende gelesen <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>
]]></description><link>https://www.c-plusplus.net/forum/post/956458</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/956458</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Wed, 04 Jan 2006 11:36:37 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion mit Rückgabe-Objekt, das nicht ignoriert werden kann on Wed, 04 Jan 2006 12:09:59 GMT]]></title><description><![CDATA[<p>Hmm die dynamische Variante hatte ich mir auch schon überlegt. Trotzdem danke <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>Gedacht hatte ich an soetwas in der Art:</p>
<pre><code class="language-cpp">class ReturnProxy
{
  friend class WatchDog;
  ~ReturnProxy();  
};

class WatchDog
{
public:
  WatchDog( ReturnProxy&amp;); // hier Besitz und Verantwortlichkeit für das Zerstören übernehmen
};
</code></pre>
<p>Das Problem, wo ich nicht drum rum gekommen bin, war bis jetzt immer, dass der ReturnProxy auch irgendwo stirbt, weil die Rückgabe ja per Value ist.</p>
<p>Ich hatte schon an Sachen mit temporären Objekten gedacht, die an const-Referenzen gebunden werden. Was aber nichts daran ändert, dass auch das temporäre Objekt wieder zerstört wird - es aber nur vom dafür privilegierten Watchdog zerstört werden kann.</p>
<p>Eventuell auch solche Sachen, dass das temporäre, unzerstörbare Objekt durch URVO wegoptimiert wird, wenn es von einem Konstruktor angenommen wird. Aber das wäre schon wieder nicht standardkonform, meine ich.</p>
<p>Und dass eine Überladung (dann mit Compiletime-Assertion) gewählt wird, wenn man den Returnwert weglässt, ist ja auch nicht drin.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/956497</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/956497</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Wed, 04 Jan 2006 12:09:59 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion mit Rückgabe-Objekt, das nicht ignoriert werden kann on Wed, 04 Jan 2006 12:16:45 GMT]]></title><description><![CDATA[<p>Genau dasselbe Problem hab ich auch bei meiner Variante. Ich meld mich, wenn ich was hab <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/956509</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/956509</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Wed, 04 Jan 2006 12:16:45 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion mit Rückgabe-Objekt, das nicht ignoriert werden kann on Wed, 04 Jan 2006 12:26:39 GMT]]></title><description><![CDATA[<p>@7H3 N4C3R<br />
Ich würde behaupten, dass eine Compiler-Zeit-Prüfung nicht möglich ist. Meine Begründung für die Behauptung: Alexandrescu hat mal versucht sowas zu basteln und es nicht geschafft (er hat dann nur eine Laufzeit-Assert-Variante vorgestellt). Dann hat er die C++ Community (besser gesagt die CUJ-Leserschaft) gefragt und meines Wissens nach bisher keine positive Antwort bekommen. Das ist aber natürlich kein Beweis, deshalb, falls du was findest, bitte bitte posten <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="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/956522</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/956522</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Wed, 04 Jan 2006 12:26:39 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion mit Rückgabe-Objekt, das nicht ignoriert werden kann on Wed, 04 Jan 2006 12:48:45 GMT]]></title><description><![CDATA[<p>Alexandrecus Ideen haben mich ja erst inspiriert sowas zu versuchen. <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="🙂"
    /> Zumindest die Sache mit den Objekten, die bei Zerstörung flexible Operationen ausführen.</p>
<p>Dass selbst er keine Lösung gefunden hat, bestätigt aber auch sehr meine Annahme, dass es nicht lösbar ist. Lässt sich das überhaupt formal beweisen? <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="🙂"
    /> Falls mir natürlich eine göttliche Inspiration kommen sollte, lasse ich sie euch wissen <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>
]]></description><link>https://www.c-plusplus.net/forum/post/956560</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/956560</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Wed, 04 Jan 2006 12:48:45 GMT</pubDate></item></channel></rss>