C++ C++;如何为参数指定它可以使用的特定枚举?

C++ C++;如何为参数指定它可以使用的特定枚举?,c++,parameters,enumeration,C++,Parameters,Enumeration,我如何给一个参数一个允许传递的值列表?下面是一个示例函数: void GamePiece::Rotate(int z){ int x, y; for(int i = 0; i < 4; i++){ x = pieceRectangles_[i].getPosition().y * z; y = pieceRectangles_[i].getPosition().x; } } void GamePiece::旋转(intz){ int

我如何给一个参数一个允许传递的值列表?下面是一个示例函数:

void GamePiece::Rotate(int z){
    int x, y;
    for(int i = 0; i < 4; i++){
        x = pieceRectangles_[i].getPosition().y * z;
        y = pieceRectangles_[i].getPosition().x;
    }
}
void GamePiece::旋转(intz){
int x,y;
对于(int i=0;i<4;i++){
x=pieceRectangles_Ui].getPosition().y*z;
y=分段矩形[i].getPosition().x;
}
}

我希望z要么是1要么是负1。除了if语句之外,如何确保这一点?

您可以使用实际的
枚举类
,而不是通过
int
传递值

enum class ERotation { eCW = 1, eCCW = -1 };
那么你的功能就是

void GamePiece::Rotate(ERotation const& z){
    // ...
}
但是请注意,如果像这样使用
enum
,就不能用位置乘以
z
,因为没有到int的隐式转换

const int rotation = (z == ERotation::eCW) ? 1 : -1;
或者正如@rici所提到的,您可以显式地强制转换
enum

const int rotation = int(z);

使用
enum类
是并且不允许传递枚举之外的值。这也比
bool
更具扩展性,因为您可以有多个值,而不是两个值。

您可以使用实际的
枚举类
,而不是通过
int
传递值

enum class ERotation { eCW = 1, eCCW = -1 };
那么你的功能就是

void GamePiece::Rotate(ERotation const& z){
    // ...
}
但是请注意,如果像这样使用
enum
,就不能用位置乘以
z
,因为没有到int的隐式转换

const int rotation = (z == ERotation::eCW) ? 1 : -1;
或者正如@rici所提到的,您可以显式地强制转换
enum

const int rotation = int(z);

使用
enum类
是并且不允许传递枚举之外的值。这也比
bool
更具扩展性,因为您可以有多个值,而不是两个值。

使用布尔值而不是
int

void GamePiece::Rotate(bool positive){
    int x, y;
    for(int i = 0; i < 4; i++){
        x = pieceRectangles_[i].getPosition().y * ( positive ? 1 : -1 );
        y = pieceRectangles_[i].getPosition().x;
    }
}
void GamePiece::旋转(bool正值){
int x,y;
对于(int i=0;i<4;i++){
x=分段矩形[i].getPosition().y*(正?1:-1);
y=分段矩形[i].getPosition().x;
}
}

您可能应该将该参数称为顺时针,但我不知道在您的系统中顺时针是+1还是-1。

使用布尔值而不是
int

void GamePiece::Rotate(bool positive){
    int x, y;
    for(int i = 0; i < 4; i++){
        x = pieceRectangles_[i].getPosition().y * ( positive ? 1 : -1 );
        y = pieceRectangles_[i].getPosition().x;
    }
}
void GamePiece::旋转(bool正值){
int x,y;
对于(int i=0;i<4;i++){
x=分段矩形[i].getPosition().y*(正?1:-1);
y=分段矩形[i].getPosition().x;
}
}

您可能应该将该参数称为顺时针,但我不知道在您的系统中顺时针是+1还是-1。

请使用布尔值或枚举数,并在需要时将其转换为1或-1。

请使用布尔值或枚举数,当需要时,将其转换为1或-1。

在我看来,您正在沿正或负Z方向围绕虚拟法线(轴)在2D中进行90度旋转:

#include <iostream>

struct Point
{
    int x;
    int y;

    Point(int x, int y)
    :   x(x), y(y)
    {}
};

struct VirtualNormalZ
{
    int value;
    VirtualNormalZ(int value)
    :   value(0 <= value ? 1 : -1)
    {}
};

// CCW is positive
Point Rotate90Degrees(const Point p, const VirtualNormalZ& normal)
{
    return Point(p.y * -normal.value, p.x * normal.value);
}

int main()
{
    VirtualNormalZ positive_normal(123);
    Point p(1, 0);
    std::cout << "Positive:\n";
    for(unsigned i = 0; i < 4; ++i)
    {
        std::cout << p.x << ", " << p.y << '\n';
        p = Rotate90Degrees(p, positive_normal);
    }
    VirtualNormalZ negative_normal(-123);
    std::cout << "Negative:\n";
    for(unsigned i = 0; i < 4; ++i)
    {
        std::cout << p.x << ", " << p.y << '\n';
        p = Rotate90Degrees(p, negative_normal);
    }
}
#包括
结构点
{
int x;
int-y;
点(整数x,整数y)
:x(x),y(y)
{}
};
结构虚拟规范
{
int值;
虚拟正常值(int值)

:value(0在我看来,您正在围绕虚拟法线(轴)沿正Z方向或负Z方向进行90°的2D旋转:

#include <iostream>

struct Point
{
    int x;
    int y;

    Point(int x, int y)
    :   x(x), y(y)
    {}
};

struct VirtualNormalZ
{
    int value;
    VirtualNormalZ(int value)
    :   value(0 <= value ? 1 : -1)
    {}
};

// CCW is positive
Point Rotate90Degrees(const Point p, const VirtualNormalZ& normal)
{
    return Point(p.y * -normal.value, p.x * normal.value);
}

int main()
{
    VirtualNormalZ positive_normal(123);
    Point p(1, 0);
    std::cout << "Positive:\n";
    for(unsigned i = 0; i < 4; ++i)
    {
        std::cout << p.x << ", " << p.y << '\n';
        p = Rotate90Degrees(p, positive_normal);
    }
    VirtualNormalZ negative_normal(-123);
    std::cout << "Negative:\n";
    for(unsigned i = 0; i < 4; ++i)
    {
        std::cout << p.x << ", " << p.y << '\n';
        p = Rotate90Degrees(p, negative_normal);
    }
}
#包括
结构点
{
int x;
int-y;
点(整数x,整数y)
:x(x),y(y)
{}
};
结构虚拟规范
{
int值;
虚拟正常值(int值)

:value(0我不理解您的问题如果您想要编译时验证,请使用两个函数(RotatePositive,RotateNegative)-您可以将其包装在模板中我不理解您的问题如果您想要编译时验证,请使用两个函数(RotatePositive,RotateNegative)-您可以将其包装在一个模板中,您可以显式转换为int。此外,枚举是类型安全的,但不完全是值安全的,因为您也可以显式转换为int。@rici我不知道这一点。这确实很有趣。知道为什么它们允许您执行
旋转(42)
如果这不是枚举值之一?我发现对@Cyber进行了彻底的讨论:编译器通常不知道预期的枚举值是什么,因为枚举经常被使用(尽管在C API中更是如此)在C++03中,有一个公式可以找到枚举可以存储的标准保证最小值和最大值,因此它不一定只是“任何int”,而在C++11中,您可以选择指定一个影响可存储值的特定基础整数类型。您可以显式转换为int。此外,枚举是类型安全的,但不完全是值安全的,因为您也可以显式转换为int。@rici我不知道这一点。这确实很有趣。知道他们为什么允许您这样做吗如果这不是枚举值之一,是否执行
Rotation(42)
?我发现对@Cyber进行了彻底的讨论:编译器通常不知道预期的枚举值是什么,因为枚举经常被使用(尽管在C API中更是如此)但是,在C++03中,有一个公式可以找到枚举可以存储的标准保证最小值和最大值,因此它不一定只是“任何int”,而在C++11中,您可以选择指定影响可以存储的值的特定基础整数类型。