2016-05-28 8 views
6

異なる数値型間のキャストのベストプラクティスは何ですか?タイプfloatdoubleintは、私がC++で最もよく使うものです。数値型間のキャストのC++ベストプラクティス

ffloatnあるオプションの例としては、doubleint次のとおりです。

float f = static_cast<float>(n); 
float f = float(n); 
float f = (float)n; 

私は通常static_cast<T>(...)を書きますが存在する場合C++開発コミュニティ内の任意の合意があったのか疑問に思っ好ましい方法。

これは意見に基づく質問であり、標準的な方法ではない場合があります。標準的な方法がないことを私に知らせてください。少なくとも:-)

私は一般的に鋳造との関連でcropped upを持っていますが、数値に特に興味があり、数値型のアプローチに具体的なベストプラクティスがあるかどうかについては興味があります。

+0

「標準的な」C++の方法である 'static_cast'を使用し、C++ 11から何も変わっていません。 – songyuanyao

+3

ベストプラクティスは、キャストを必要としないプログラムを書くことです。 – Drop

+0

'float f = n;'は私の好みです –

答えて

4

static_castをそのまま使用してください。 Cキャストの問題は、操作のあいまいさ(すなわち、Explicit type conversionのpoint(1))です。

キャストがこれを回避します。さらに、C++のキャストは、それらを検索するときにより目立ちます。

使用Stroustrup氏の言葉(What good is static_cast?):開発やメンテナンス時に、関連するタイプのいずれかが変更され、場合

でも無実に見えるキャストは深刻な問題になることができます。たとえば、これはどういう意味ですか?

わかりません。それはタイプTとxとyのタイプに依存します。 Tは、クラスの名前、、またはテンプレートパラメータである可能性があります。たぶんxyはスカラー変数であり、(T)は値変換を表します。たぶんxyのクラスから派生したクラスであり、(T)はダウンキャストです。たぶんxyは、無関係なポインタ型です。 Cスタイルのキャスト(T)は、多くの論理的に異なる操作を表現するために使用できるため、コンパイラは誤用を捕まえる可能性が非常に低いです。同じ理由から、プログラマはキャストが何をしているかを正確に知ることができない。初心者が間違っていると推測すると、これは初心者プログラマにとっては利点と考えられ、微妙なエラーの原因となることがあります。

"新しいスタイルのキャスト"は、プログラマに意図を明確に述べ、コンパイラがより多くのエラーをキャッチできるようにするために導入されました。

[CUT]

新しいスタイルのキャストを導入するための第二の理由は、Cスタイルのキャストがプログラムで見つけることが非常に困難であるとしました。たとえば、通常のエディタやワープロを使用して、キャストを便利に検索することはできません。

[CUT]

は本当に現代のC++

にほとんど回避されているキャストもより安全な代替(Boost.NumericConversionライブラリの一部)であることboost::numeric::converter/boost::numeric_cast考えます。

など。 (static_castを介して)暗黙的な変換と明示的な変換の両方のために一般的に

#include <iostream> 
#include <boost/numeric/conversion/cast.hpp> 

int main() 
{ 
    using boost::numeric_cast; 

    using boost::numeric::bad_numeric_cast; 
    using boost::numeric::positive_overflow; 
    using boost::numeric::negative_overflow; 

    try 
    { 
    int i = 42; 
    short s = numeric_cast<short>(i); // This conversion succeeds (is in range) 
    } 
    catch(negative_overflow &e) { std::cout << e.what(); } 
    catch(positive_overflow &e) { std::cout << e.what(); } 

    return 0; 
} 

範囲の保存の欠如は、エラーが発生しやすい数値型の間の変換を行います。

numeric_castは、数値型の変換時に範囲の損失を検出し、その範囲を保持できない場合は例外をスローします。 固有のキャスト演算子伝統的な鋳造事業者

+0

"時にはそれは変換です...時にはそれはキャストです" *私には分かりません。キャストは明示的な変換ですが、そうではありませんか? – user2079303

+0

@ user2079303あなたは正しいです:それは「Googleの用語」(https://google.github.io/styleguide/cppguide.html#Casting)ですが、通常のC++の使用法と正確には一致しません(http://stackoverflow.com/ q/4337306/3235496)。私は誤解を避けるためにその行を変更しました。 – manlio

+0

リンクをありがとう。それは私が将来この用語につきまとうときに役立ちます。このガイドでは、キャストとその用語のコンバージョンの違いについては説明していません。 – user2079303

0

一般的に、これらのキャスト演算子は、2つの主要なグループに分類されています。 dynamic_castを、reinterpret_castは、static_castをしてはconst_cast:クラス間の変換これらのタイプを制御するために、我々は4つの特定のキャスト演算子を持っている...

cplusplus.comはこのようにそれを説明しています。それらの書式は、角括弧(<>)で囲まれた新しいタイプとその直後の括弧の間で変換される式に従います。

dynamic_cast <new_type> (expression)

reinterpret_cast <new_type> (expression)

static_cast <new_type> (expression)

const_cast <new_type> (expression)

これらの式に伝統的なタイプキャスト同等物は次のようになります。

(new_type) expression

new_type (expression)

しかし、それぞれ独自の特徴があります。

私たちは(ほぼ)すべてのキャストを使用しています。アドバイスを検討した後、それはあなた次第です。

resourceを参照してください。

関連する問題