<?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[I love Lambdas]]></title><description><![CDATA[<p>schöner Hackaround, oder Mist? (oder Overkill?)</p>
<pre><code>class Exception : public std::exception
{
public:
    Exception(std::string message, unsigned int code, int line, std::vector &lt;std::string&gt; const&amp; additional_parms)
        : message_ 
        {
            [&amp;]() /*noexcept*/ -&gt; std::string
            {
                // modify message (replace stuff with additional parameters)
                return message_;
            }()
        }
        , code_{code}
        , line_{line}
        , fileName_{std::move(fileName)}
    {
        // cannot modify / assign message_ here.
    }

    // what, message, code...

private:
    const std::string message_; // CONST, weil... warum nicht?
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/324976/i-love-lambdas</link><generator>RSS for Node</generator><lastBuildDate>Mon, 13 Jul 2026 07:58:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/324976.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 09 Apr 2014 21:02:49 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to I love Lambdas on Wed, 09 Apr 2014 21:02:49 GMT]]></title><description><![CDATA[<p>schöner Hackaround, oder Mist? (oder Overkill?)</p>
<pre><code>class Exception : public std::exception
{
public:
    Exception(std::string message, unsigned int code, int line, std::vector &lt;std::string&gt; const&amp; additional_parms)
        : message_ 
        {
            [&amp;]() /*noexcept*/ -&gt; std::string
            {
                // modify message (replace stuff with additional parameters)
                return message_;
            }()
        }
        , code_{code}
        , line_{line}
        , fileName_{std::move(fileName)}
    {
        // cannot modify / assign message_ here.
    }

    // what, message, code...

private:
    const std::string message_; // CONST, weil... warum nicht?
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2393721</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2393721</guid><dc:creator><![CDATA[5cript]]></dc:creator><pubDate>Wed, 09 Apr 2014 21:02:49 GMT</pubDate></item><item><title><![CDATA[Reply to I love Lambdas on Wed, 09 Apr 2014 21:26:09 GMT]]></title><description><![CDATA[<p>1. Exceptions sollten keinen dynamischen Speicher besitzen (std::string), weil das bad_alloc o.Ä. provozieren kann. Also nur const char*+int.</p>
<p>2. Die {}-Initialisierung um alles in der Welt vermeiden. Hier ist sie sinnlos.</p>
<p>3. Bei Konstruktoren gehe ich normalerweise immer den Weg über delegierte Konstruktoren</p>
<pre><code class="language-cpp">class NotAnExceptionClass : public std::exception
{
public:
    // Parameter genau das, was in Membern abgelegt wird.
    NotAnExceptionClass(std::string message, unsigned int code, int line)
        : message_(std::move(message))
        , code_(code)
        , line_(line)
        , fileName_(std::move(fileName))
    {
    }

    NotAnExceptionClass(std::string message, unsigned int code, int line, std::vector &lt;std::string&gt; const&amp; additional_parms)
        NotAnExceptionClass(format_msg(message, additional_params)), code, line)
        // format_msg kann auch ein Lambda sein, aber das kommt äusserst selten vor
    {}

    // what, message, code...

private:
    const std::string message_; // CONST, weil... warum nicht?
}
</code></pre>
<p>4. const-Member sind böse, weil der effiziente move-Konstruktor/move-Operator dadurch unmöglich wird.</p>
<p>5. Lambdas zur Initialisierung verwende ich in der Praxis nur zur Initialisierung von statischen (statisch in einer Funktion) oder globalen Variablen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2393733</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2393733</guid><dc:creator><![CDATA[critizizer]]></dc:creator><pubDate>Wed, 09 Apr 2014 21:26:09 GMT</pubDate></item><item><title><![CDATA[Reply to I love Lambdas on Wed, 09 Apr 2014 21:31:00 GMT]]></title><description><![CDATA[<p>critizizer schrieb:</p>
<blockquote>
<p>1. Exceptions sollten keinen dynamischen Speicher besitzen (std::string), weil das bad_alloc o.Ä. provozieren kann. Also nur const char*+int.</p>
</blockquote>
<p>aber ignoriere ich wissentlich. Wenn das passiert, darf mir das gerne um die Ohren fliegen.</p>
<p>critizizer schrieb:</p>
<blockquote>
<p>2. Die {}-Initialisierung um alles in der Welt vermeiden. Hier ist sie sinnlos.</p>
</blockquote>
<p>hmmm, ich bin eher gerade beim Umstellen in die andere Richtung...</p>
<p>critizizer schrieb:</p>
<blockquote>
<p>4. const-Member sind böse, weil der effiziente move-Konstruktor/move-Operator dadurch unmöglich wird.</p>
</blockquote>
<p>Interessant.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2393734</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2393734</guid><dc:creator><![CDATA[5cript]]></dc:creator><pubDate>Wed, 09 Apr 2014 21:31:00 GMT</pubDate></item><item><title><![CDATA[Reply to I love Lambdas on Wed, 09 Apr 2014 21:36:23 GMT]]></title><description><![CDATA[<p>critizizer schrieb:</p>
<blockquote>
<p>1. Exceptions sollten keinen dynamischen Speicher besitzen (std::string), weil das bad_alloc o.Ä. provozieren kann. Also nur const char*+int.</p>
</blockquote>
<p>So allgemein würde ich das nicht formulieren, wenn man von runtime_error ableitet ist das kein Problem.</p>
<p>critizizer schrieb:</p>
<blockquote>
<p>4. const-Member sind böse, weil der effiziente move-Konstruktor/move-Operator dadurch unmöglich wird.</p>
</blockquote>
<p><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="👍"
    /> Und nicht nur deshalb, auch ein assignment Operator ist dadurch nicht mehr möglich. Tatsächlich sollte man so oft es geht, und es geht eigentlich immer, auf const-member verzichten.</p>
<p>Aber generell finde ich diese Exception-Klasse suboptimal designed, mal ganz unabhängig von der Lambda. Wozu haben wir denn mehrere Typen und ein virtual what()? Um hinterher wieder eine Mutter-Aller-Exceptions-Klasse zu bauen? Nein danke. Einfach einen runtime_error oder ein kleines von runtime_error abgeleitetes Objekt werfen, bitte nichts mit unspezifizierten Extra-Parametern oder Code-Lines. Über error-codes kann man streiten, aber auch dann eher im Stil von <a href="http://en.cppreference.com/w/cpp/header/system_error" rel="nofollow">http://en.cppreference.com/w/cpp/header/system_error</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2393735</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2393735</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Wed, 09 Apr 2014 21:36:23 GMT</pubDate></item><item><title><![CDATA[Reply to I love Lambdas on Wed, 09 Apr 2014 22:14:41 GMT]]></title><description><![CDATA[<p>Ok, das nimmt eine interessante Richtung gen der Exception class, deshalb mehr Struktur:</p>
<pre><code>class Message : public std::exception // derived for compatibility
// (ist eigentlich nicht nötig, nur für what())
{
    // ... eingies vom ersten post
}

class Warning : public Message
{
    // ...
}

class Error : public Message
{
    // ...
}

#define REGISTER_ERROR(NAME)
// leite hier NAME von Error ab und überlade diverse methoden in Makro
// (zum Beispiel what)
// das ist dann zentralisiert mit enum error codes und den dazugehörigen messages

#define REGISTER_WARNING(NAME)
// selbes. siehe oben
</code></pre>
<p>später:</p>
<pre><code>// hier ein paar makros, die einfach zeigen sollen, was ich dann mit den Klassen mache:
#define ERROR(TYPE, /*more*/) // fügt Fehler einer Liste hinzu, kein Abbruch
#define WARN(TYPE, /*more*/)  // fügt Warnung einer Liste hinzu
#define FATAL(TYPE, /*more*/) // throw TYPE{/*more*/}
</code></pre>
<p><strong>EDIT: warum kopiert <s>oder moved</s> man exceptions <s>rum</s>? Das klingt nach einer dummen idee!</strong> (moved durchgestrichen, weil das kann ich mir noch vorstellen)</p>
<p>EDIT2: Das replacing ist um Zusatzinformationen in die Fehler zu bekommen, da die Fehlermeldung nicht im fehlerproduzierenden Code selbst zusammengesetzt werden, sondern, woanders liegen. Das Ganze ist dann im std::snprintf style.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2393738</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2393738</guid><dc:creator><![CDATA[5cript]]></dc:creator><pubDate>Wed, 09 Apr 2014 22:14:41 GMT</pubDate></item><item><title><![CDATA[Reply to I love Lambdas on Wed, 09 Apr 2014 22:58:39 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>critizizer schrieb:</p>
<blockquote>
<p>1. Exceptions sollten keinen dynamischen Speicher besitzen (std::string), weil das bad_alloc o.Ä. provozieren kann. Also nur const char*+int.</p>
</blockquote>
<p>So allgemein würde ich das nicht formulieren, wenn man von runtime_error ableitet ist das kein Problem.</p>
</blockquote>
<p>Ich würd schon sagen dass es scheisse ist, wenn während des Exception-Handlings eine <code>std::bad_alloc</code> Exception fliegt. So double-faultet man sich schnell ins Abseits.</p>
<p>Daher sollte man in seinen Exception-Klassen auch hübsch <code>shared_ptr&lt;string const&gt;</code> statt <code>string</code> verwenden. So sind die dann nämlich noexcept-kopierbar.</p>
<p>@Tim06TR<br />
Die &quot;schöne&quot; Variante wäre mMn. eher die Werte beim Erzeugen der Exception einfach nur alle unverändert in die Member zu packen, und die Message dynamisch zu formatieren wenn <code>what()</code> aufgerufen wird.<br />
Damit der String nach dem Aufruf von <code>what()</code> bestehen bleibt, verpasst man der Exception Klasse einfach nen zusätzlichen <code>shared_ptr&lt;string const&gt;</code> , der erstmal Leer ist, und erst beim ersten Aufruf von <code>what()</code> befüllt wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2393743</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2393743</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 09 Apr 2014 22:58:39 GMT</pubDate></item><item><title><![CDATA[Reply to I love Lambdas on Thu, 10 Apr 2014 00:15:21 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Daher sollte man in seinen Exception-Klassen auch hübsch shared_ptr&lt;string const&gt; statt string verwenden. So sind die dann nämlich noexcept-kopierbar.</p>
</blockquote>
<p>Hmmm, ja, nette Idee. <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/2393752</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2393752</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Thu, 10 Apr 2014 00:15:21 GMT</pubDate></item><item><title><![CDATA[Reply to I love Lambdas on Thu, 10 Apr 2014 08:24:13 GMT]]></title><description><![CDATA[<blockquote>
<p>und es geht eigentlich immer, auf const-member verzichten.</p>
</blockquote>
<p>Eigentlich?</p>
<p>Übrigens, Lambdas kann man kürzer schreiben</p>
<pre><code>[&amp;]
{
    // modify message (replace stuff with additional parameters)
    return message_;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2393771</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2393771</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Thu, 10 Apr 2014 08:24:13 GMT</pubDate></item></channel></rss>