0

メンバー関数への呼び出しが状態を変更する可能性があり、デフォルト値のブール値に依存しない場合があるいくつかのクラスがあります。

 A a;
 a.set( "foobar" );
 assert( a.changed() == true );

 A a;
 a.set( "foobar", false );
 assert( a.changed() == false );

これらのメンバー関数は仮想であることに注意してください。エイリアスを使用してコードを読みやすくし、古いメソッドを引き続き許可するプライベートメンバー関数を作成し、ラッパーのみをパブリックに提供することをお勧めします。

 a.silentlySet( "foobar" ) {
    a.set( "foobar", false );
 }

とにかく、これはインライン化されると思います。可読性も向上する列挙型と定数を記述できることはわかってa.set( "foobar", SILENTLY );いますが、問題はブール値の性質 (するかどうか) であるため、私はそれで気分が良くありません。反対側。しかし、このような状況にどのように対処するかをお聞きしたいと思います。(私は確かにいくつかの重要な詳細を見逃しているので、「場合による」という答えが得られると思います)それで生きますか?

これらのメンバー関数は、頻繁に呼び出されたり使用されたりすることはありませんが、めったに使用されることもありません。私が恐れているのは、ブール値が別の意味を持つ場合に、silent/not_silent-flag と誤解することがあるということです。

これも誤解を招く可能性がある例:

if( b->getData( false ) && something_other )

これは混同される可能性がありますb->getData() == false

4

1 に答える 1

3

しかし、問題はブール型の性質であるため、[ここで列挙型を使用する]には満足できません(実行するかどうか)。

いいえ、列挙型はこれに最適です。使用してください。FWIW、CodeReviewでこのケースに関する別の議論があります。

そうは言っても、ラッパー関数はおそらくインライン化されます。C ++は、実行時のコストなしで抽象化を提供することを目的としています。関数呼び出しのインライン化はこの点で基本的なツールであるため、コンパイラーは該当する場合は常にそれを使用します。

于 2012-07-09T09:46:13.967 に答える