C ++如何为参数提供特定的枚举?

时间:2014-09-30 18:16:26

标签: 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;
    }
}

我希望z为1或负1.除了if语句,我该如何确保?

4 个答案:

答案 0 :(得分:3)

您可以使用实际的enum class,而不是通过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 classtypesafe并且不允许传递枚举之外的值。这也比bool更具可扩展性,因为您可以有多个值,而不是两个。

答案 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;
    }
}

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

答案 2 :(得分:1)

在我看来,你正在以正或负Z方向围绕虚拟法线(轴)进行二维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);
    }
}

答案 3 :(得分:0)

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