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中,您可以选择指定影响可以存储的值的特定基础整数类型。