2009-07-02 7 views
0

私はクラスCMyClassを作成しました。そのクラスのCTorは、引数としてUCHARをとります。その引数は、さまざまな列挙型(すべてUCHARに収まることが保証されています)の値を持つことができます。このような値をUCHARに変換する必要があるのは、ライブラリ関数がその型としてパラメータを要求しているからです。列挙型の値を整数型の値に変換する際に、コンパイラの警告を避けるにはどうすればよいですか?

私はboost::assignを使用し、それらのメッセージオブジェクトの多くを作成すると労力を入力して保存する必要があります。

std::vector<CMyClass> myObjects; 
     boost::assign::push_back(myObjects) 
      (MemberOfSomeEnum) 
      (MemberOfSomeEnum); 

std::vector<CMyClass> myOtherObjects; 
     boost::assign::push_back(myObjects) 
      (MemberOfAnotherEnum) 
      (MemberOfAnotherEnum); 

上記のコードは2人の列挙メンバーのそれぞれにCMessage CTORを呼び出し、その後でそれらを置きますリスト。 私の問題は、このコードがVC++ 9で警告C4244(enumからUCHARへの変換中にデータが失われる可能性がある)がスローされることです。

私の現在のソリューションは、各列挙型の変換関数を作成することです:

static UCHAR ToUchar(const SomeEnum eType) 
{ 
    return static_cast<UCHAR>(eType); 
} 

static UCHAR ToUchar(const AnotherEnum eType) 
{ 
    return static_cast<UCHAR>(eType); 
} 

そして、上記のコードは次のようになります。

std::vector<CMyClass> myObjects; 
     boost::assign::push_back(myObjects) 
      (ToUchar(MemberOfSomeEnum)) 
      (ToUchar(MemberOfSomeEnum)); 

std::vector<CMyClass> myOtherObjects; 
     boost::assign::push_back(myObjects) 
      (ToUchar(MemberOfAnotherEnum)) 
      (ToUchar(MemberOfAnotherEnum)); 

これは私が考える可能性が最もクリーンなアプローチでありますこれまでのところ。

もっと良い方法がありますか?
ブーストには何か素晴らしいものがありますか?

プラグマステートメントで警告を無効にしたくないため、列挙型を変更できません。

答えて

5

私はここにはstatic_castでemabarrassedされないだろうが、あなたがしている場合:

template <class T> 
inline UCHAR ToUchar(T t) 
{ 
    return static_cast<UCHAR>(t); 
} 

は、すべて列挙する機能を書いて保存します。

+0

これは、「ToUchar (SomeEnumMember)」と読みにくくなるたびに書き込む必要が生じます。それは私が「クリーン」で意味したものです。 – foraidt

+3

いいえ、テンプレート引数が導き出されます:ToUchar(SomeEnumMember) – fizzer

+0

申し訳ありません、あなたは正しいです!コメントを書く前に試してみたはずです: -/ – foraidt

関連する問題