2013-03-08 3 views
9

C++プログラムでenumパラメータを取得する必要があります。これは、パラメータを介して値を返す関数を使用して取得する必要があります。私はintとして宣言することから始めましたが、コードレビューでenum(ControlSource)としてタイプするように求められました。私はこれをしましたが、Get()関数が壊れていました。-&のCスタイルのキャストが問題を解決したことに気付きましたが、最初にstatic_cast <で修正しようとしましたが、コンパイルされませんでした。static_cast <int&>を使用して整数参照パラメータをC++の関数に渡すことができないのはなぜですか?

なぜeTimeSourceがint型の場合、整数を参照渡しする必要はありませんか?

//GetCuePropertyValue signature is (int cueId, int propertyId, int& value); 

ControlSource eTimeSource = ControlSource::NoSource; 

pPlayback->GetCuePropertyValue(programmerIds.cueId, DEF_PLAYBACKCUEPROPERTY_DELAY_SOURCE, static_cast<int&>(eTimeSource)); //This doesn't work. 

pPlayback->GetCuePropertyValue(programmerIds.cueId, DEF_PLAYBACKCUEPROPERTY_DELAY_SOURCE, (int&)(eTimeSource)); //This does work. 

int nTimeSource = 0; 
pPlayback->GetCuePropertyValue(blah, blah, nTimeSource); //Works, but no (int&) needed... why? 
+0

を取るために、関数のパラメータを変更するために、彼らはおそらくも意味列挙型に変数を変更するには言わなかった「作品を、ない(INT&)が必要...なぜ?」場合 - 参照渡しの変数については、C++のドキュメントを参照してください(または、http://stackoverflow.com/a/410857/1174378を参照してください) –

+0

二重かっこを削除しました。 Cスタイルのキャストがこのオブジェクトに対してreinterpret_castを呼び出していると仮定して正しく動作しますか?もしそうなら、int型を基にしたenumについては本当に重要ですか? – Gareth

+0

いいえ、 'reinterpret_cast'はCスタイルの" sledgehammer "キャストと同じではありません。タイプを変更した後にコードを動作させるために醜いハッキーなキャストが必要な場合は、タイプを変更しないでください!それは 'int'でうまく動作し、enumで正常に動作しません...私に答えが何であるかはかなりわかります –

答えて

8

あなたが別の型の値に変数を変換するときは、非一定の基準にバインドすることはできません一時的な値を取得:それは一時的に変更しても意味がありません。

static_cast<int const &>(eTimeSource) 

しかし、あなたにもちょうどではなく、参照よりも、実際の値を作成することができます:

あなただけに必要がある場合は、に値を読んで、一定の基準には問題ないはず

static_cast<int>(eTimeSource) 
+0

static_cast (eTimeSource)のキャストでは、コンパイラは関数の適切なオーバーロードを見つけることができず、static_cast (eTimeSource)にも同じことが言えます。 const参照を取得するためにGetProperty関数を更新する必要はありません。他の場所で多くの変更を加える必要があると思われます。 – Gareth

+1

@Gareth:次に、ローカル変数 'int i = static_cast (eTimeSource);を作成し、' i'で関数を呼び出します。 –

+0

十分に公正 - それは明らかに機能します。しかし、私は変数を最初にintとして宣言して始めましたが、キャストは一切ありませんでしたが、査読者はそれを気に入らなかったのです!私は彼のポイントを見ます - タイプを正しく宣言すると、それが何であるかが明確になりますが、それによってこの問題が発生します... – Gareth

3
static_cast<int&>((eTimeSource))); //This doesn't work. 

eTimeSourceintではないため、正しく動作しませんので、をバインドすることはできませんそれに。

(int&)((eTimeSource))); //This does work. 

間違っていても、どちらもうまくいかないようです。 Cスタイルのキャストはコンパイラにあり、 "合法でない場合でもこのタイプにする"と言います。ちょうど何かがコンパイルされていてもそれが機能するわけではありませ

なぜそれがeTimeSourceintた時に何のキャストが参照することにより、整数を渡すために全く必要とされないということですか?

あなたは別のタイプにint&intにではなく、バインドすることができますので、とeTimeSourceは異なるタイプです。 int&intへの参照です。別のタイプにバインドすることができれば、それはintを参照しませんでしょうか?

コードレビューアは、あなたがControlSource&

+0

'ControlSource'が実際に' enum class'である場合はどうなりますか? OPsコードが与えられると、それはAFAICSのオプションです。 –

+0

ControlSourceはC++ネイティブのenumであり、enumクラスやref enumではありません。 さらに、校閲者は、パラメータが列挙型に変更されることを望まない、または期待しませんでした。基礎となるデータ記憶域クラスは、値がint型であることに依存しています。 (これは、enum型の導入には時間がかかりすぎるため、GetMethodデリゲートのシグネチャではenumとintの違いを知ることができず、ツイストで過負荷)。 「適切な」署名作業を行うことは、私が利用可能なATMを持っている時間と互換性がありません! – Gareth

+0

@DanielFrey、それは私の答えに何か変わるだろうか? (TBH私はそれを少しだけ読み返していますので、それを修正してください) –

関連する問題