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与枚举值之一不匹配,则结果值未指定。这可能是一个严重的问题。

您需要事先确定您将要转换的值是 that 的合法值enum。当您考虑到这一点时,通常这会破坏首先进行演员表的目的。

这通常表明你做错了什么。为什么需要将整数值转换为enum?一个可能的原因是因为您从套接字中提取了该值,或者从其他一些进程间通信方式中获取了该值。除此之外,不会立即想到其他有效的用例。这是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 回答
0

要解决错误和逻辑问题:

#include <vector>

place getPos(vector<int>& pin)
{
    int i;
    for(i = 0; i < pin.size(); i++)
   //            ^ Needs to be <, not <=
   //              ^^^^^^^^^^ Needs to be pins.size(), not sizeof(pins) 
    {
        if (pin[i])
            break;
    }

    // alternatively,
    //int i = std::find_if(pins.begin(), pins.end(), [](int a)
    //{
    //    return a != 0;
    //});

    place castEnum = DEFAULT_ENUM_VALUE; // whatever you want for a default enum value
    switch (i)
    {
    case ENUM_VALUE_1:
        castEnum = ENUM_VALUE_1;
        break;
    case ENUM_VALUE_2:
        castEnum = ENUM_VALUE_2;
        break;
    // etc.
    }
    return castEnum;
}

使用 switch 语句可以避免尝试强制转换对您的枚举无效的值的问题。您需要将枚举值(例如INVALID_ENUM = -1)定义为默认值。

于 2013-11-06T17:24:13.203 回答