私はクラス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));
これは私が考える可能性が最もクリーンなアプローチでありますこれまでのところ。
もっと良い方法がありますか?
ブーストには何か素晴らしいものがありますか?
プラグマステートメントで警告を無効にしたくないため、列挙型を変更できません。
これは、「ToUchar(SomeEnumMember)」と読みにくくなるたびに書き込む必要が生じます。それは私が「クリーン」で意味したものです。 –
foraidt
いいえ、テンプレート引数が導き出されます:ToUchar(SomeEnumMember) – fizzer
申し訳ありません、あなたは正しいです!コメントを書く前に試してみたはずです: -/ – foraidt