2016-11-02 8 views
1

は私が憧れるこれが指定され、変更しないでくださいキャストベクトル<int>とベクトル<long>のサイズが同じ場合は?

Void blarf(std::vector<long>&); 

のベクトルへの参照を取る機能があります。 xyz.cppに深くblarf()vectorintのSを供給しようとする試みである:私の場合は

std::vector<int> gooddata; 
. . . 
blarf(gooddata); 

とこのソフトウェアのすべての場合、intlongは同じサイズです。もちろん、gooddataの定義を変更することはできません。

どのようなタイプキャストが適切ですか?私はdynamic_castを試しましたが、それは多態的なクラス変換のためだけです。 static_castもどちらも問題ありません。私はC + +型のキャストで天才だ。

+0

イー、これは醜いフォーマットです。家に帰るときにそれを修正します。 – DarenW

+3

未定義の振る舞いをする危険がある場合は、 'reinterpret_cast'を使用することができます。 –

+1

あなたのコードがそれを買う余裕がある場合、テンプレートを考慮してください: 'template void blarf(std :: vector &);' –

答えて

6

いいえ、できません。 intlongは異なる種類のままですが、厳密なエイリアシング規則が破られます。

あなたは非常に簡単にvector<int>からvector<long>を作成することができます。

std::vector<int> vec{5, 3, 7, 9}; 
std::vector<long> veclong(begin(vec), end(vec)); 

これは、2回の反復子を取るvectorのコンストラクタで、veclongvecをコピーします。

あなたが使用すること自由に感じ、その後、それを悪い道を(すなわち、未定義の挙動を示すこと)やりたい場合:

*reinterpret_cast<std::vector<long>*>(&vec) 
関連する問題