C++ 函数,该函数返回强制转换枚举值C++;

C++ 函数,该函数返回强制转换枚举值C++;,c++,function,class,vector,enums,C++,Function,Class,Vector,Enums,我试图使用传感器位置的枚举值创建一个类,我使用int类型的向量作为这个函数的输入,我想要一个枚举值。我不确定这个代码是否有效。我不太确定如何测试它 #include <vector> place getPos(vector<int>& pin) { int i; for(i = 0; i <= sizeof(pin); i++) { if (pin[i]) break; }

我试图使用传感器位置的枚举值创建一个类,我使用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;

    }
#包括
放置getPos(矢量和引脚)
{
int i;

对于(i=0;i可使用
static\u cast
将整数值转换为
enum

enum FooType
{
  ftOne = 1,
  ftTwo
};

int main()
{
  const int n = 1;
  FooType ft = static_cast <FooType> (n);
}
enum FooType
{
ftOne=1,
FT2
};
int main()
{
常数int n=1;
FooType ft=静态_铸造(n);
}
由于
static\u cast
是编译时操作,并且
n
仅在运行时已知,因此如果
n
与枚举值之一不匹配,则结果值未指定。这可能是一个严重问题

您需要事先确定要强制转换的值是否是该
enum
的合法值。当您想到这一点时,通常这会首先破坏执行强制转换的目的


这通常表示您做错了什么。为什么需要将整数值强制转换为
枚举
?一个可能的原因是您从套接字中提取了该值,或者是从其他进程间通信方式中获取的。除此之外,没有其他有效的用例可以立即想到。这是一个可使用
静态\u转换将整数值转换为
枚举

enum FooType
{
  ftOne = 1,
  ftTwo
};

int main()
{
  const int n = 1;
  FooType ft = static_cast <FooType> (n);
}
enum FooType
{
ftOne=1,
FT2
};
int main()
{
常数int n=1;
FooType ft=静态_铸造(n);
}
由于
static\u cast
是编译时操作,并且
n
仅在运行时已知,因此如果
n
与枚举值之一不匹配,则结果值未指定。这可能是一个严重问题

您需要事先确定要强制转换的值是否是该
enum
的合法值。当您想到这一点时,通常这会首先破坏执行强制转换的目的


这通常表示您做错了什么。为什么需要将整数值强制转换为
枚举
?一个可能的原因是您从套接字中提取了该值,或者是从其他进程间通信方式中获取的。除此之外,没有其他有效的用例可以立即想到。这是一个典型的症状。

只是修复了明显的问题:

#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);
}

只是解决了显而易见的问题:

#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);
}

要解决错误和逻辑问题,请执行以下操作:

#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;
}
#包括
放置getPos(矢量和引脚)
{
int i;
对于(i=0;i//^需要来解决错误和逻辑问题:

#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;
}
#包括
放置getPos(矢量和引脚)
{
int i;
对于(i=0;i//^需要。您可以编写一些测试用例,看看它是否能产生预期的结果。我至少可以看到一个问题。
sizeof(pin)< /代码>不会做你认为它做的事情。如果你不确定如何测试它,你不确定它应该如何工作。首先澄清它,然后运行它,以验证它实际上是这样做的。另一个重要的问题是,在枚举中根本没有定义的值。C++样式的CAST无论在C++程序中都没有什么业务。从字面上看,XY问题,实际问题是X,但是你已经确定了你的解决方案中的问题Y作为需要修复的东西。我认为你使用向量为const大小数组。考虑使用<代码> STD::数组< /Cord>并将数组大小定义为宏。你可以编写一些测试用例,看看它是否产生了你所期望的结果。请至少查看一个问题。
sizeof(pin)< /代码>不会做你认为它做的事情。如果你不确定如何测试它,你不确定它应该如何工作。首先澄清它,然后运行它,以验证它实际上是这样做的。另一个重要的问题是,在枚举中根本没有定义的值。C++样式的CAST无论在C++程序中都没有什么业务。这实际上是XY问题的一个问题,在这里,实际问题是X,但是您已经确定了解决方案中的问题Y作为需要解决的问题。我认为您使用向量作为常量数组。考虑使用<代码> STD::数组< /Cord>,并将数组大小定义为宏。“如果n不匹配其中一个枚举值,则结果值未指定”这是一种轻微的简化;如果结果值不在枚举数的范围内,则结果值未指定。如果基础类型是固定的,则此类型定义范围;否则,范围为[0,2^n]对于正枚举数,其中N基于最小和最大枚举数值。@DyP:您是否建议为
enum{foo_a=1,foo_b=3}指定
static_cast(2)
?我想是的;至少我调查过这件事,当时它似乎定义得很好。@DyP:我觉得这很奇怪。谢谢你的澄清。“如果n与枚举值之一不匹配,那么结果值是未指定的。”“这是一个轻微的简化;如果结果值不在枚举数的范围内,则结果值是未指定的。如果基础类型是固定的,则此类型定义范围;否则,正枚举数的范围是[0,2^N],其中N基于最小和最大枚举数值。@DyP:您是否建议
静态_强制转换(2)
是为
枚举{foo_a=1,foo_b=3}指定的;
?我想是的;至少我调查过这个问题,当时它似乎定义得很好。@DyP:我觉得很奇怪。谢谢你的澄清。