Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 具有非零起始值的枚举类上的运算符+_C++_Enums_Operator Overloading - Fatal编程技术网

C++ 具有非零起始值的枚举类上的运算符+

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

我需要enum类的高效运算符+,问题是enum不是从零开始的,这使得计算很困难

以下是有关的枚举:

#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告诉此起始值被命中的次数。这就是你如何知道结果必须增加多少。