boost::optional<T>
(1.51) は、ユーザーにとって非常に危険であり、防止したいオブジェクトを構築する方法を提供します。独自の整数クラスがあり、オプションのそのような整数を渡し、それをいくつかのクラスに格納したいとしましょう:
class myint {
public:
int m_a;
myint (int r_a) : m_a(r_a) {
}
};
struct myclass {
boost::optional<myint> content;
myclass (const boost::optional<myint>& arg) : content(arg) {
}
};
そして今、ユーザーがクラスを使用する方法は次のとおりです。
myclass(myint(13)); //correct use
myclass(boost::none); //correct use
myclass(myint(0)); //correct use
myclass(0); //INCORRECT use, this easy typo
//equates boost::none which
//is not what the user meant
ここで何が起こっているのかを理解し、この動作を防ぎたいと思います。
興味深いことに、
myclass(1); //does not compile
boost::none
私のフィールドでは完全に有効な値ですがboost::none
、ユーザーが入力しようとしているときにこっそりと入力すると、0
ひどく誤解を招き、危険です。
myint
クラスを実際にロールアウトするわけclass myclass
ではなく、ほとんどまたはまったく目的を果たさない を実際に持っていないため、意図は少し隠されている可能性があります。とにかく、関数に 10 個程度のオプションの int を送信する必要があり、重複排除は機能しません。(私があなたの年齢、身長、財産を尋ねたのと、質問に答えたくない場合に確認するための 3 つの特別なボタンがあることを想像してみてください)
以下に機能するように見える回答を投稿しました(MooingのDuck&Ilonesmizの提案から作成されましたが、より軽量です)。でも、コメントいただけると嬉しいです。