2016-04-27 7 views
2

だから私はこのようなクラスがあります。私が最もあるかを知りたいC++ 11スタイルでキャストする正しい方法ですか?

(ロング別名符号なし) 暗黙の型変換をint型からsize_typeに:(1)私は、テキストと警告してしまったでは

A{ 
init(int a){ 
_data.resize(a); //! (1) 
} 
//other code is unimportant 
private: 
std::list<std::vector<double>> _data; 
} 

をその警告を取り除く正しい方法は? たぶんそのような何か:

_data.resize(static_cast<decltype(_data)::size_type>(a) 

ノート:

init(size_t a) 

正しい方法ですが、私たちはインターフェース

+8

'のinitは(size_t a){' –

+0

@Revolver_Ocelotこれは正しい方法だと思いますが、インターフェースを変更できないとしましょう。 – tty6

+1

何かをキャストするのではなく、引数がコンテナのサイズの型として表現可能かどうかをチェックする方が便利です。 –

答えて

7

を変更することはできませんと仮定してみましょう:私は、このことを

推測あなたのサンプルキャストは正しい方法です:

  1. 明示的にキャストしようとしています。
  2. これは正しいタイプにキャストされ、将来の_dataタイプの変更から保護されています。
  3. 正しいキャストを使用しています。

インターフェイスの変更が問題になる場合は、それに従ってください。

入力する前にサニティチェックを追加すると良いでしょう。あなたがunsignedにキャストする前に負の値をチェックするのが最も基本的で便利な方法です。

+1

私は追加したいと思います:キャストの前に陰性の 'a'があるかどうか調べてください。 –

+0

@エミリーL。これは良い提案です、私はポストに追加します。 –

+0

あなたは範囲チェックを行うboostからnumeric_castを調べることができます –

2

このような単純な:

_data.resize(std::size_t(a)); 

このようとして狂気:

_data.resize(static_cast<std::size_t>(a)); 

C-スタイルがサポートもキャスト:

_data.resize((std::size_t)a); 
+3

サイドノートとして、最初の提案(機能的なキャスト)とCスタイルのキャストは同じことを書く2つの方法です。 – user2079303

+0

@ user2079303、私は知っています。私の答えの意図は、同じことをするいくつかの方法が存在することを示すことでした。だからここに行く:) – ForceBru

+0

私はあなたが知っていると確信しています。しかし、キャストする正しい方法を知っている人は誰も知りません。 – user2079303

4
_data.resize(static_cast<decltype(_data)::size_type>(a)); 

しかし、大きな問題がunsignedを締結しているし、あなたが使用し、あなたがそのようにintで立ち往生していると言う:最も正しい方法は、あなたが言うようです

_data.resize(static_cast<unsigned int>(a)); 
関連する問題