如何为参数提供允许传递的值列表?这是一个示例函数:
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语句,我该如何确保?
答案 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 class
为typesafe并且不允许传递枚举之外的值。这也比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。