2017-03-20 17 views
0

私が作成しているクラスの最大サイズを明示的に制限しようとしていますが、動作しているように見えますが醜いように見えます。この例はやや工夫されていますが、状況がより自然に発生した場合に備えて私は知りたいと思います。C++イニシャライザリストの制約チェック

であるとしてここでは、次のとおりです。

PriorityQueue(const unsigned int maxSizeIn) : 
      maxSize((maxSizeIn >= SOME_CONSTANT) ? SOME_CONSTANT - 1 : maxSizeIn), 
      queueArray(new PriorityPair<T>*[maxSizeIn]()), 
      currentHeapSize(0) 
{ 

} 

clunkinessは、初期化子リスト中の三元表現を持っていることから来ています。これはうまくいくが、リストの各構成要素を1行ずつ細かく分けなければならないということは特に気にならない。私はそのロジックをコンストラクタの本体に移そうとしましたが、私はそれをどのように試して問題が発生しました。

わかりやすくするために、私は元のものを編集して、私が求めていることをより強調しています。つまり、イニシャライザのリストに制約を加えるのがよりクリーンで機能的に同等な方法があります。

このような問題の解決策は何でしょうか。あなたはそのためのstd::min使用する

+0

なぜ 'maxSizeIn'は' numeric_limits :: max() 'と等しくないのですか? – NathanOliver

+0

@ NathanOliverその部分は任意です。私はもっ​​と全部の頑固さに心配しています。 – Caboose

答えて

0

: - あなたの例ではSOME_CONSTANTだろう。ここ

maxSize(std::min(maxSizeIn, std::numeric_limits<unsigned int>::max() - 1)); 

を、std::numeric_limits<unsigned int>::max() - 1はいかなる一定にすることができます。

あなたの場合は何も意味をなさないことに注意してください。 maxSizeInは、その型の最大値より大きくなることはありません。誰かがコンストラクタにstd::numeric_limits<unsigned int>::max()より大きいサイズを指定すると、その人は引数がオーバーフローしたことをすぐに認識します。

代わりにunsigned longを渡すこともできます。

+0

オリジナルの投稿を編集して、私が求めていることをさらに強調しています。私が行った例は不十分なものでした。私は、std :: minは、それがちょうどラッパーであっても、ソリューションを少し短くてきれいにするだろうと考えています。 maxSizeの後にあなたが持っている括弧は、インタライザーリストのための有効な構文ですか? – Caboose

+0

@Cabooseはい、これはC++ 11の機能です。私はそれを変更します:) – Rakete1111

+0

@Cabooseあなたの明確化は私のために本当に明らかにしていません。あなたはあなたが持っている 'SOME_CONSTANT'に対して' std :: min'を使うことができます。もっと複雑な制約のような意味ですか? – Rakete1111