C++ 具有非零起始值的枚举类上的运算符+
我需要enum类的高效运算符+,问题是enum不是从零开始的,这使得计算很困难 以下是有关的枚举:C++ 具有非零起始值的枚举类上的运算符+,c++,enums,operator-overloading,C++,Enums,Operator Overloading,我需要enum类的高效运算符+,问题是enum不是从零开始的,这使得计算很困难 以下是有关的枚举: #include <cstdint> #include <iostream> enum class CardRank : std::uint16_t { Two = 2, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Qu
#include <cstdint>
#include <iostream>
enum class CardRank : std::uint16_t
{
Two = 2,
Three,
Four,
Five,
Six,
Seven,
Eight,
Nine,
Ten,
Jack,
Queen,
King,
Ace // = 14
};
下面是测试代码:
int main()
{
CardRank rank = CardRank::King;
// = CardRank::Ace
std::cout << static_cast<std::uint16_t>(rank + 1) << std::endl;
// = CardRank::Four
std::cout << static_cast<std::uint16_t>(rank + 17) << std::endl;
// = CardRank::Two
std::cout << static_cast<std::uint16_t>(rank + 41) << std::endl;
// = CardRank::Ten
std::cout << static_cast<std::uint16_t>(rank + 114) << std::endl;
std::cin.get();
}
计算是正确的,算符工作正常,但问题是我只想把两个数字相加,
但结果表明,获得结果所需的计算量不值得使用运算符
有没有一些传统的更有效的方法使这更简单
编辑:
顺便说一句,我不能将Ace添加到开头并将其设置为1,因为排序算法会从最高的卡片排序到最小的卡片。意思是王牌必须高于王牌
编辑
多亏了这些答案,我得出了以下结论:
inline CardRank operator+(const CardRank& rank, const std::uint16_t num)
{
constexpr std::uint16_t offset = 2;
constexpr std::uint16_t cards = 13;
return static_cast<CardRank>((static_cast<std::uint16_t>(rank) - offset + num) % cards + offset);
}
问题是枚举不从零开始,这使得计算变得困难
这是真的-所以首先要做的是减去2,使其以0为基础。记住在末尾加上2。这使它变得简单
inline CardRank operator+(const CardRank& rank, const std::uint16_t num)
{
std::uint16_t need = (static_cast<std::uint16_t>(rank) - 2 + num) % 13 + 2;
return static_cast<CardRank>(need);
}
问题是枚举不从零开始,这使得计算变得困难
这是真的-所以首先要做的是减去2,使其以0为基础。记住在末尾加上2。这使它变得简单
inline CardRank operator+(const CardRank& rank, const std::uint16_t num)
{
std::uint16_t need = (static_cast<std::uint16_t>(rank) - 2 + num) % 13 + 2;
return static_cast<CardRank>(need);
}
操作员+中需要/14的含义是什么?如我所见,这意味着smth几乎是const std::uint16_t num比最大可能值大多少倍?需要%14是在0处获取不存在的起始值,需要/14告诉此起始值被命中的次数。这就是你如何知道结果必须增加多少。运算符+中的/14是什么意思?如我所见,这意味着smth几乎是const std::uint16_t num比最大可能值大多少倍?需要%14是在0处获取不存在的起始值,需要/14告诉此起始值被命中的次数。这就是你如何知道结果必须增加多少。