ボタンを表すクラスを記述しています。このボタンには、テキスト、ショートカット、テクスチャまたはフラットカラーの塗りつぶしなどのさまざまな属性がある場合とない場合があります。たとえば、このボタンにテクスチャが設定されていない場合、テクスチャ描画処理はスキップされます。std :: optionalと "unused/default"の値の使用
私の最初の解決策は、指定された属性が使用されていない(色のアルファ値が0だった場合、カラー塗りの描画をスキップするなど)デフォルト値を使用することでした。
私が持っているその他のオプションは、新しく追加されたstd :: optionalを使うことです。これははるかに明確で使いやすいでしょう。ここで
は2つの言及した例です:class Button {
void draw() {
if (fill)
drawRectangle(*fill);
if (sprite)
drawSprite(*sprite);
if (font)
drawText(name, *font);
}
std::optional<std::string> font;
std::optional<std::string> sprite;
std::optional<Color> fill;
}
class Button {
void draw() {
if (fill.alpha != 0)
drawRectangle(fill);
if (sprite != "")
drawSprite(sprite);
if (font != "")
drawText(name, font);
}
std::string font;
std::string sprite;
Color fill;
}
のstd ::オプションを使用することの利点とdisadvatagesが、この場合に何をすることができますか?私が主に興味を持っているのは、メモリ使用量とオーバーヘッドの違いです。
また、ifを使用してvalueに値が含まれているかどうかをチェックする代わりに、value()をコールして例外をキャッチする必要がありますか?
'.value()'を使用し、値を持っているかどうかをチェックするのではなく、例外をキャッチすることに関して、あなたの質問に関して:それは悪い考えです。名前が示すように、例外は例外的なケースであり、スタックアンローリングによるオーバーヘッドは無視できません。例えば、多くのボタンが使用されていると仮定する。色はありません。オプションの空白は例外的なケースではありません。 – Corristo
空の文字列が文字列とまったく違っていない限り、 'std :: optional'は非常に便利です。 –
'std :: optional'は、クラスのメンバーではなく、関数の戻り値のためのものです。これはかなり無駄なことです。また、 'sprite.exy()'は 'sprite ==" "'上で使用されるべきです。 – Pubby