c++ - 枚举类的operator +且起始值非零

标签 c++ enums operator-overloading

对于枚举类,我需要高效的operator+,问题是枚举不是从零开始的,因此计算很困难。

这是有问题的枚举:

#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
};

我希望该枚举的operator+接受任何整数值(short的上限)。

经过一段时间的努力,我得出了以下算法:
inline CardRank operator+(const CardRank& rank, const std::uint16_t num)
{
    std::uint16_t need = static_cast<std::uint16_t>(rank) + num;

    if (need < 15)
        return static_cast<CardRank>(need);

    std::uint16_t result = need % 14 + need / 14;

    return static_cast<CardRank>(result > 14 ? result - 13 : result);
}

这是测试代码:
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();
}

计算正确,运算符工作正常,但问题是我只想累加两个数字,
但是事实证明,获得结果所需的计算量不值得运算符(operator)花费。

是否有一些常规的更有效的方法可以使这一过程变得更简单?

编辑:
顺便说一句,我不能将Ace添加到开头并将其设置为1,因为排序算法是从最高的牌到最小的牌排序的。意思是ace必须在国王之上。

编辑

多亏了答案,我得出了以下一种衬板:
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);
}

最佳答案

problem is that enum does not start at zero making calculation difficult.



的确如此-因此,要做的第一件事是将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);
}

关于c++ - 枚举类的operator +且起始值非零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59561785/

相关文章:

c++ - 带有 std::future 的 VS 11 - 这是一个错误吗?

c++ - 奇怪的运行时错误

Java枚举和循环问题

ios - 将对象添加到枚举给我错误

rust - 如何为可迭代变量的枚举实现 IntoIterator?

c# - 在 C# 中是否可以通过以下方式重载泛型转换运算符?

C++ 运算符 "="重载 - 使 lhs 上 vector ​​中的所有值等于 rhs 上的 double 值

c++ - 在 C++ 中创建一个集合<char>

C++抽象类无法实例化

c++ - 当类包含虚方法时,为什么 clang 会创建这些隐式方法?