<?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[Konstruktor aufruf mit bool Variablen]]></title><description><![CDATA[<pre><code>struct Settings
{
    Settings() : option1( false ),
                 option2( false ),
                 option3( false )
    {
    }

    Settings( bool option1, bool option2, bool option3 )  : option1( option1 ),
                                                            option2( option2 ),
                                                            option3( option3 )
    {
    }

    bool option1;
    bool option2;
    bool option3;
};

int main()
{
    Foo( Settings( true, true, true ) ); 
}
</code></pre>
<p>Kann man den Aufruf lesbarer machen in C++?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/330104/konstruktor-aufruf-mit-bool-variablen</link><generator>RSS for Node</generator><lastBuildDate>Fri, 03 Jul 2026 11:54:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/330104.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 22 Dec 2014 11:18:33 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Konstruktor aufruf mit bool Variablen on Mon, 22 Dec 2014 11:18:33 GMT]]></title><description><![CDATA[<pre><code>struct Settings
{
    Settings() : option1( false ),
                 option2( false ),
                 option3( false )
    {
    }

    Settings( bool option1, bool option2, bool option3 )  : option1( option1 ),
                                                            option2( option2 ),
                                                            option3( option3 )
    {
    }

    bool option1;
    bool option2;
    bool option3;
};

int main()
{
    Foo( Settings( true, true, true ) ); 
}
</code></pre>
<p>Kann man den Aufruf lesbarer machen in C++?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2434160</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2434160</guid><dc:creator><![CDATA[aliB]]></dc:creator><pubDate>Mon, 22 Dec 2014 11:18:33 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor aufruf mit bool Variablen on Mon, 22 Dec 2014 11:23:08 GMT]]></title><description><![CDATA[<pre><code>struct Settings
{
    // [..]
    static const Settings allTrue; 
};

const Settings::allTrue(true, true, true);
</code></pre>
<p>?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2434161</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2434161</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Mon, 22 Dec 2014 11:23:08 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor aufruf mit bool Variablen on Mon, 22 Dec 2014 11:25:06 GMT]]></title><description><![CDATA[<p>Ja, enums:</p>
<pre><code>enum option1_t
{
  option1_disabled,
  option1_enabled,
};
enum option2_t
{
  option2_disabled,
  option2_enabled,
};
...
Settings(option1_t opt1, option2_t opt2,...)
...
Settings(option1_enabled, option2_disabled, ...)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2434162</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2434162</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Mon, 22 Dec 2014 11:25:06 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor aufruf mit bool Variablen on Mon, 22 Dec 2014 12:21:14 GMT]]></title><description><![CDATA[<p>Jeder normaldenkende Programmierer würde das so umsetzen:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;boost/parameter.hpp&gt;

BOOST_PARAMETER_NAME(option1)
BOOST_PARAMETER_NAME(option2)
BOOST_PARAMETER_NAME(option3)

struct settings_impl {
  bool option1, option2, option3;

  template &lt;class ArgumentPack&gt;
  settings_impl(ArgumentPack const&amp; args)
    : option1(args[_option1 | false]),
      option2(args[_option2 | false]),
      option3(args[_option3 | false]) {}
};

struct settings : settings_impl
{
  BOOST_PARAMETER_CONSTRUCTOR(settings, (settings_impl), tag,
                              (optional (option1, *) (option2, *) (option3, *)))

  friend std::ostream&amp; operator&lt;&lt;(std::ostream&amp; os, settings const&amp; s) {
    return os &lt;&lt; &quot;settings(&quot;
              &lt;&lt; &quot;option1=&quot; &lt;&lt; std::boolalpha &lt;&lt; s.option1 &lt;&lt; &quot;, &quot;
              &lt;&lt; &quot;option2=&quot; &lt;&lt; std::boolalpha &lt;&lt; s.option2 &lt;&lt; &quot;, &quot;
              &lt;&lt; &quot;option3=&quot; &lt;&lt; std::boolalpha &lt;&lt; s.option3 &lt;&lt; &quot;)&quot;;
  }
};

int main()
{
  settings x(false, true);                      // positional
  settings y(_option1 = true, _option2 = true); // named
  settings z(_option3 = true);                  // positional/defaulted
  std::cout &lt;&lt; &quot;x: &quot; &lt;&lt; x &lt;&lt; '\n';
  std::cout &lt;&lt; &quot;y: &quot; &lt;&lt; y &lt;&lt; '\n';
  std::cout &lt;&lt; &quot;z: &quot; &lt;&lt; z &lt;&lt; '\n';
}
</code></pre>
<p>Ausgabe:</p>
<pre><code>x: settings(option1=false, option2=true, option3=false)
y: settings(option1=true, option2=true, option3=false)
z: settings(option1=false, option2=false, option3=true)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2434168</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2434168</guid><dc:creator><![CDATA[normaldenker]]></dc:creator><pubDate>Mon, 22 Dec 2014 12:21:14 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor aufruf mit bool Variablen on Mon, 22 Dec 2014 13:00:08 GMT]]></title><description><![CDATA[<p>normaldenker schrieb:</p>
<blockquote>
<p>Jeder normaldenkende Programmierer würde das so umsetzen:<br />
[...]</p>
</blockquote>
<p>Haelst du es nicht fuer praktisch, dafuer noch einen neuen Thread zu starten, damit man parallel zum einlesen schon wieder was anderes machen kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2434174</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2434174</guid><dc:creator><![CDATA[Marthog]]></dc:creator><pubDate>Mon, 22 Dec 2014 13:00:08 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor aufruf mit bool Variablen on Mon, 22 Dec 2014 13:06:47 GMT]]></title><description><![CDATA[<p>Marthog schrieb:</p>
<blockquote>
<p>normaldenker schrieb:</p>
<blockquote>
<p>Jeder normaldenkende Programmierer würde das so umsetzen:[...]</p>
</blockquote>
<p>Haelst du es nicht fuer praktisch, dafuer noch einen neuen Thread zu starten, damit man parallel zum einlesen schon wieder was anderes machen kann?</p>
</blockquote>
<p>Nein, das wäre Overkill.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2434176</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2434176</guid><dc:creator><![CDATA[normaldenker]]></dc:creator><pubDate>Mon, 22 Dec 2014 13:06:47 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor aufruf mit bool Variablen on Thu, 25 Dec 2014 23:11:03 GMT]]></title><description><![CDATA[<p>Was sollen &quot;option1,2,3&quot; sein? Gib ihnen Namen!</p>
<pre><code>struct Settings
{
    enum printOption_e
    {
        NO_PRINT,
        PRINT   
    };

    enum saveOption_e
    {
        AUTO_SAVE,
        MANUAL_SAVE
    };

    enum alarmOption_e
    {
        SILENT,
        ALARMING
    };

    Settings( printOption_e po = NO_PRINT, saveOption_e so = AUTO_SAVE, alarmOption_e ao = SILENT )  
    : printOption( po )
    , saveOption( so )
    , alarmOption( ao )
    {}

    printOption_e printOption;
    saveOption_e saveOption;
    alarmOption_e alarmOption;
};

int main()
{
    Foo( Settings( Settings::PRINT, Settings::MANUAL_SAVE, Settings::ALARMING ) );
}
</code></pre>
<p>~Edit: alles in die Klasse (wg. namespace) II: 1. Vorschlag gelöscht, war eh Mist~</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2434667</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2434667</guid><dc:creator><![CDATA[minastaros]]></dc:creator><pubDate>Thu, 25 Dec 2014 23:11:03 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor aufruf mit bool Variablen on Thu, 25 Dec 2014 20:52:45 GMT]]></title><description><![CDATA[<p>Wobei der gesamte Ansatz etwas seltsam ist: Warum die Optionen nicht gleich als Eigenschaften der Klasse Foo?<br />
Optionen werden oft einfach bit-weise kombiniert, z.B:</p>
<pre><code>struct Foo
{
    enum options_e
    {
        NONE = 0,
        PRINTING = 1 &lt;&lt; 0,
        SAVING   = 1 &lt;&lt; 1,
        ALARMING = 1 &lt;&lt; 2
    };

    Foo( unsigned int opt = NONE )  
    : options( opt )
    {}

private:
    unsigned int options;
};

int main()
{
    Foo( Foo::PRINTING | Foo::SAVING | Foo::ALARMING );
}
</code></pre>
<p>Etwas unschön ist, dass kombinierte Enum-Werte nicht mehr vom Enum-Typ sind, sondern (unsigned) int.</p>
<p>Sind denn die Optionen der jeweiligen Foo-Instanz zur Compilezeit schon bekannt? Dann könnte man auch über Polymorphie oder Policy-Klassen nachdenken... Das macht dann die Auswertung der Optionen innerhalb von Foo eleganter.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2434703</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2434703</guid><dc:creator><![CDATA[minastaros]]></dc:creator><pubDate>Thu, 25 Dec 2014 20:52:45 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor aufruf mit bool Variablen on Fri, 26 Dec 2014 15:00:35 GMT]]></title><description><![CDATA[<p>aliB schrieb:</p>
<blockquote>
<p>Kann man den Aufruf lesbarer machen in C++?</p>
</blockquote>
<p>Da gibt es viele Möglichkeiten, einige wurden auch schon genannt. Hier eine weitere:</p>
<pre><code>struct Settings
{
    struct Builder {
        explicit Builder(const Settings &amp;s = Settings());
        Builder(const ::Builder &amp;other);
        ~Builder() noexcept;

        Builder&amp; operator=(const RequestBody::Builder &amp;other);

        operator Builder() const;

        Builder&amp; option1(bool state);
        Builder&amp; option2(bool state);
        Builder&amp; option3(bool state);

    private:
        struct Private;
        Private *d = nullptr;
    };

    Settings() : option1( false ),
                 option2( false ),
                 option3( false )
    {
    }

    friend Builder;
    bool option1;
    bool option2;
    bool option3;
};
</code></pre>
<pre><code>struct Settings::Builder::Private {
    Private(const Settings &amp;s) : settings s ) {}

    Settings settings;
};

Settings::Builder::Builder(const Settings &amp;s)
  : d( new Private( s ) ) {
}

Settings::Builder::Builder(Settings::Builder const &amp;other)
  : d( new Private( other.d-&gt;body ) ) {
}

Settings::Builder::~Builder() {
    delete d;
}

Settings::Builder&amp; Settings::Builder::operator=(Settings::Builder const &amp;other) {
    d-&gt;settings = other.d-&gt;settings;
    return *this;
}

Settings::Builder::operator Settings() const {
    return d-&gt;settings;
}

Settings::Builder&amp; Settings::Builder::option1(bool state) {
    d-&gt;settings.option1 = state;
    return *this;
}

Settings::Builder&amp; Settings::Builder::option1(bool state) {
    d-&gt;settings.option2 = state;
    return *this;
}

Settings::Builder&amp; Settings::Builder::option3(bool state) {
    d-&gt;settings.option3 = state;
    return *this;
}
</code></pre>
<pre><code>int main()
{
    Settings s = Settings::Builder().option1( true ).option3( true );

    // Wenn du sprechendere Namen verwendest, wäre es noch lesbarer:
    //Url url = Url::Builder().schema( &quot;http&quot; ).host( &quot;www.c-plusplus.net&quot; ).port( 80 ).path( &quot;/forum/posting&quot; );
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2434744</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2434744</guid><dc:creator><![CDATA[Hilefoks]]></dc:creator><pubDate>Fri, 26 Dec 2014 15:00:35 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor aufruf mit bool Variablen on Fri, 26 Dec 2014 15:23:50 GMT]]></title><description><![CDATA[<pre><code>enum { OPT1 = 0x1, OPT2 = 0x2, OPT3 = 0x4 };

void Foo(int n){ /* ... */ }

main(){
  Foo(OPT1 | OPT2 | OPT3);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2434745</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2434745</guid><dc:creator><![CDATA[großbuchstaben]]></dc:creator><pubDate>Fri, 26 Dec 2014 15:23:50 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor aufruf mit bool Variablen on Fri, 26 Dec 2014 15:44:07 GMT]]></title><description><![CDATA[<p>minastaros schrieb:</p>
<blockquote>
<p>Etwas unschön ist, dass kombinierte Enum-Werte nicht mehr vom Enum-Typ sind, sondern (unsigned) int.</p>
</blockquote>
<p>Dafür gibts Operatorüberladung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2434747</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2434747</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 26 Dec 2014 15:44:07 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor aufruf mit bool Variablen on Fri, 26 Dec 2014 18:31:49 GMT]]></title><description><![CDATA[<p>Hilefoks schrieb:</p>
<blockquote>
<p>Da gibt es viele Möglichkeiten, einige wurden auch schon genannt. Hier eine weitere:</p>
<pre><code>struct Settings
{
    // Settings Klasse
    struct Builder {
        // eine weitere Klasse, die kein Mensch braucht, es aber viel umständlicher macht
</code></pre>
</blockquote>
<p>Und das soll besser sein? Ineffizient (überflüssige Allokation) und umständlich nur um 3 Optionen zu setzen. Vom Ansatz dennoch nicht ganz weit weg. Hier ist eine einfachere und effizientere Variante:</p>
<pre><code>class Settings
{
  bool _option1;
  bool _option2;
  bool _option3;

public:
  Settings()
    : _option1(false),
      _option2(false),
      _option3(false)
      { }

  Settings&amp; option1(bool sw)   { _option1 = sw; return *this; }
  Settings&amp; option2(bool sw)   { _option2 = sw; return *this; }
  Settings&amp; option3(bool sw)   { _option3 = sw; return *this; }
  bool option1() const  { return _option1; }
  bool option2() const  { return _option2; }
  bool option3() const  { return _option3; }
};

int main(int argc, char* argv[])
{
  Settings s = Settings().option1(true).option2(true).option3(true);

  // oder ein Beispiel sprechenden Namen:
  Settings s = Settings().schema( &quot;http&quot; ).host( &quot;www.c-plusplus.net&quot; ).port( 80 ).path( &quot;/forum/posting&quot; );
}
</code></pre>
<p>Der Code ist lesbarer und der syntaktische Zucker kann vom Compiler komplett weg optimiert werden.</p>
<p>Man kann natürlich auch wahlweise die Member öffentlich machen und die getter weg lassen, wie im ersten Beispiel. Dann muss man sich nur sinnvolle Namen für die setter ausdenken, wie z.B. <code>setOption1(bool)</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2434766</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2434766</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Fri, 26 Dec 2014 18:31:49 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor aufruf mit bool Variablen on Sat, 27 Dec 2014 10:12:47 GMT]]></title><description><![CDATA[<p>zur (weiteren) Info: dies nennt sich dann <a href="http://en.wikibooks.org/wiki/More_C++_Idioms/Named_Parameter" rel="nofollow">Named Parameter Idiom</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2434813</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2434813</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Sat, 27 Dec 2014 10:12:47 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor aufruf mit bool Variablen on Sat, 27 Dec 2014 12:32:22 GMT]]></title><description><![CDATA[<p>tntnet schrieb:</p>
<blockquote>
<p>Vom Ansatz dennoch nicht ganz weit weg. Hier ist eine <strong>einfachere</strong> und effizientere Variante:</p>
<pre><code>class Settings
{
  bool _option1;
  bool _option2;
  bool _option3;

public:
  Settings()
    : _option1(false),
      _option2(false),
      _option3(false)
      { }

  Settings&amp; option1(bool sw)   { _option1 = sw; return *this; }
  Settings&amp; option2(bool sw)   { _option2 = sw; return *this; }
  Settings&amp; option3(bool sw)   { _option3 = sw; return *this; }
  bool option1() const  { return _option1; }
  bool option2() const  { return _option2; }
  bool option3() const  { return _option3; }
};

int main(int argc, char* argv[])
{
  Settings s = Settings().option1(true).option2(true).option3(true);

  // oder ein Beispiel sprechenden Namen:
  Settings s = Settings().schema( &quot;http&quot; ).host( &quot;www.c-plusplus.net&quot; ).port( 80 ).path( &quot;/forum/posting&quot; );
}
</code></pre>
<p>Der Code ist lesbarer [...]</p>
</blockquote>
<p>ähm ... der code ist <em>einfacher</em> und <em>lesbarer</em> als</p>
<pre><code>enum { OPT1 = 0x1, OPT2 = 0x2, OPT3 = 0x4 };
Foo(OPT1 | OPT2 | OPT3);
</code></pre>
<p>??<br />
<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="😮"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2434823</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2434823</guid><dc:creator><![CDATA[großbuchstaben]]></dc:creator><pubDate>Sat, 27 Dec 2014 12:32:22 GMT</pubDate></item></channel></rss>