0

センサーの位置の列挙値を使用してクラスを作成しようとしています。この関数の入力として int 型のベクトルを使用しています。列挙値を出力したいと考えています。このコードが機能するかどうかはわかりません。私はそれをテストする方法がよくわかりません。

#include <vector>

place getPos(vector<int>& pin)
    {
        int i;
    for(i = 0; i <= sizeof(pin); i++)
    {
    if (pin[i])
        break;
    }

    place castEnum = (place)i;
    return castEnum;

    }

したがって、これは私が収集できる限りの更新です。

#include <vector>

place getPos(vector<int>& pin)
{
    int i;
    for(i = 0; i <= pin.size(); i++)
    {
        if (pin[i])
            break;
    }
    return static_cast <place> (i);

}

4

3 に答える 3

3

enumを使用して、整数値を にキャストできますstatic_cast

enum FooType
{
  ftOne = 1,
  ftTwo
};

int main()
{
  const int n = 1;
  FooType ft = static_cast <FooType> (n);
}

static_castはコンパイル時の操作でありn、実行時にのみ認識されるため、 が列挙値のいずれとも一致しない場合、n結果の値は指定されません。これは深刻な問題になる可能性があります。

キャストしようとしている値がそのための正当な値であることを事前に判断する必要がありますenum。これについて考えると、通常、これはそもそもキャストを行う目的に反します。

これは、多くの場合、何か間違ったことをしていることを示しています。整数値を にキャストする必要があるのはなぜenumですか? 考えられる理由の 1 つは、その値をソケットから取り出したか、プロセス間通信の他の手段から取得したためです。それを除けば、他の有効なユースケースはすぐに思い浮かびません。これは、XY 問題の典型的な兆候です。

于 2013-11-06T17:11:08.207 に答える
1

明らかなことを修正するだけです:

#include <vector>

place getPos(vector<int>& pin)
{
    int i;
    // sizeof(pin) is a constant representing the size of a vector type
    // Edit: missed that for(i = 0; i <= pin.size(); i++)
    for(i = 0; i < pin.size(); ++i)
    {
        if (pin[i])
            break;
    }
    return place(i);
}

それほど明白ではありません:

You may replace your vector with a std::bitset (or an unsigned integer)
representing the flags in your enum.
于 2013-11-06T17:12:29.660 に答える